一、算法介绍

有n个金币,其中一个是假币。这个假币的重量比真币的重量要轻一点,所有n-1个金币的重量是一样的。现在有一架天平,设计高效的算法(用最少的使用天平次数)找出那个假的金币。

二、算法思想

每次平均分三堆的结果可能有:余数0 余数1 余数2

  • 余数0: 平均分,任选两堆(堆1+堆2)比较,

如果平衡: 堆3含假币;

如果不平衡: 比较堆1和堆3,

如果平衡: 堆2含假币;

如果不平衡: 堆1含假币;

  • 余数1: 平均分后得到3堆+1个硬币,任选两堆(堆1+堆2)比较,

如果平衡: 比较堆1和堆3,

如果平衡: 剩余的单个硬币为假,

如果不平衡: 堆3为含假币的堆

如果不平衡: 比较堆1和堆3,

如果平衡: 堆2含假币

如果不平衡: 堆1含假币

  • 余数2: 平均分后得到3堆+2个硬币,任选两堆(堆1+堆2)比较,

如果平衡: 比较堆1和堆3

如果平衡: 假币在两个单个硬币中,这两个硬币必然是不平衡的,这时从堆中找出任意一枚硬币,从两个单个硬币中拿出硬币1进行比较

如果平衡:假币为币2

如果不平衡:假币为币1

如果不平衡: 堆3为含假币的堆

如果不平衡: 比较堆1和堆3

如果平衡: 堆2含假币

如果不平衡: 堆1含假币

三、实验代码

#include <iostream>
#include <math.h>using namespace std;#define numnum 14
int coin[numnum] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3};/*计算总重量 */
int Weight_Sum(int arr[], int low, int high)
{int sum = 0;for (int i = low; i <= high; i++)sum += arr[i];return sum;
}/* 称硬币,找出假币数组下标*/
int Weight_Coin(int coin[], int coinNum, int low, int high)
{int k = floor(coinNum / 3);int r = coinNum % 3;if (r == 0){int index = 0;int A, B, C;A = Weight_Sum(coin, low, low + k - 1);B = Weight_Sum(coin, low + k, low + 2 * k - 1);C = Weight_Sum(coin, low + 2 * k, high);if (coinNum == 3){if (A == B){index = high;}else if (A == C){index = high - 1;}else{index = low;}return index;}else{if (A == B){index = Weight_Coin(coin, k, low + 2 * k, high);return index;}else if (A == C){index = Weight_Coin(coin, k, low + k, low + 2 * k - 1);return index;}else{index = Weight_Coin(coin, k, low, k - 1);return index;}}}if (r == 1){int index = high;int A, B, C;A = Weight_Sum(coin, low, low + k - 1);B = Weight_Sum(coin, low + k, low + 2 * k - 1);C = Weight_Sum(coin, low + 2 * k, high - 1);if (coinNum == 1){return index;}else{if (A == B){if (A == C)return index;if ((A < C || A > C)){index = Weight_Coin(coin, k, low + 2 * k, high - 1);return index;}}else if (A == C){index = Weight_Coin(coin, k, low + k, low + 2 * k - 1);return index;}else{index = Weight_Coin(coin, k, low, k - 1);return index;}}}if (r == 2){int index = 0;int index1 = high - 1;int index2 = high;int A, B, C;A = Weight_Sum(coin, low, low + k - 1);B = Weight_Sum(coin, low + k, low + 2 * k - 1);C = Weight_Sum(coin, low + 2 * k, high - 2);if (coinNum < 3){int campare1; //参照物if (high != numnum - 1)campare1 = coin[numnum - 1];elsecampare1 = coin[0];if (coin[high] == campare1)index = low;if (coin[low] == campare1)index = high;return index;}else{if (A == B && B == C){int cam = coin[0];if (coin[high - 1] == cam)index = index2;if (coin[high] == cam)index = index1;return index;}else if ((A == B) && (A < C || A > C)){index = Weight_Coin(coin, k, low + 2 * k, high - 2);return index;}else if (A == C){index = Weight_Coin(coin, k, low + k, low + 2 * k - 1);return index;}else{index = Weight_Coin(coin, k, low, k - 1);return index;}}}return 0;
}
/*判断假币质量*/
void Judge(int number)
{int campareble;if (number != numnum - 1)campareble = coin[numnum - 1];elsecampareble = coin[0];if (coin[number] < campareble)cout << "假币的位置为 " << number << "  并且假币偏轻" << endl;else if (coin[number] > campareble)cout << "假币的位置为 " << number << "  并且假币偏重" << endl;elsecout << "参照出错" << endl;
}
int main()
{if (numnum < 3){cout << "数量太少,无法比较" << endl;return 0;}int number;number = Weight_Coin(coin, numnum, 0, numnum - 1);Judge(number);return 0;
}

四、实验结论

1、

2、

3、

参考博文https://blog.csdn.net/ngl158358/article/details/79953769

算法设计与分析基础——假币问题(三分法)相关推荐

  1. 算法设计与分析基础-笔记-上

    算法设计与分析基础 绪论 什么是算法 一系列解决问题的明确指令,对于符合一定规范的输入,能够在有限的时间内获得要求的输出. 例子:最大公约数:俩个不全为0 的非负整数 m m m和 n n n的最大公 ...

  2. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感

    <算法设计与分析基础>是一本由Anany levitin著作,清华大学出版社出版的胶版纸图书,本书定价:49.00元,页数:409,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助 ...

  3. 第一章 算法设计与分析基础知识

    系列文章目录 第一章 算法设计与分析基础知识 第二章 算法的分治策略 第三章 算法的动态规划 第四章 算法的贪心法 -- @[TOC](这里写目录标题) # 一级目录 ## 二级目录 ### 三级目录 ...

  4. 算法设计与分析基础知识

    一.算法设计基础 算法是(algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列. 算法的五个特性: 输入:一个算法可以有零个或多个输入. 输出:一个算法有一个输出或多个输出. 有穷性( ...

  5. 算法设计与分析基础知识点

    前言:全文参考徐承志老师的PPT 适合期末复习,查缺补漏,有缺漏或错误欢迎指正,后面的第九章内容之后会继续补充. 目录 一.算法基础概念 二.算法分析基础 1.概念 2.算法设计的一般过程 3.时间复 ...

  6. 算法设计与分析基础第三版

    课后题答案 一.算法级基础知识 1.算法的基本概念 解决问题的确定方法和有限步骤称为算法,对于计算机科学来说,算法指的是对特定问题的求解步骤的一种描述,是若干条指令的有穷序列.并有以下特性:输入.输出 ...

  7. 算法设计与分析基础 第一章谜题

    习题1.1 10.b 欧几里得游戏 一开始,板上写有两个不相等的正整数,两个玩家交替写数字,每一次,当前玩家都必须在板上写出任意两个板上数字的差,而且这两个数字必须是新的,也就是说,不能与板上任何一个 ...

  8. 算法设计与分析基础 第六章谜题

    习题6.1 9.数字填空 给定n个不同的整数以及一个包含n个空格的序列,每个空格之间事先给定有不等(>或<)符号,请设计一个算法,将n个整数填入这n个空格中并满足不等式约束.例如,数4,6 ...

  9. 算法设计与分析基础 第五章谜题

    习题5.1 11.Tromino谜题 Tromino是一个由棋盘上的三个1×1方块组成的L型骨牌.我们的问题是,如何用Tromino覆盖一个缺少了一个方块的2n×2n棋盘.除了这个缺失的方块,Trom ...

  10. 算法设计与分析基础 第七章谜题

    习题7.1 6. 祖先问题要求在一棵给定的n顶点二叉树中,确定一个顶点u是否是顶点v的祖先.设计一个属于O(n)的输入增强算法,使我们可以在常量时间内获得树的每一对顶点的足够信息,来对问题求解. 分析 ...

最新文章

  1. CentOS7 0安装Maven
  2. Android复习16【材料设计新特性:fragment、RecyclerView】
  3. 【Linux】一步一步学Linux——dpkg-deb命令(270)
  4. 在Sqoop中管理密码的关键提示
  5. mysql双机热备实现
  6. 初识python多线程
  7. inception_Inception团队在Red Hat推出DevOps
  8. RK 3399 切换以太网卡
  9. 利用Adorner制作用于图像裁切的选择框
  10. JSON.stringify的认知历程
  11. tcl php,关于tcl语言
  12. AUTO CAD快捷键常见命令
  13. pl2303 USB转串口驱动
  14. 3---IO流练习题库
  15. HELIOS模拟平台介绍
  16. bootstrap table表格点击行checkbox勾选或取消勾选
  17. java web 小学期实训小节
  18. Attributes should be specified via @SpringBootApplication问题解决
  19. UOJ#310 【UNR #2】黎明前的巧克力:FWT
  20. SpringBoot常见的经典面试题

热门文章

  1. java面试之反射机制
  2. 计组第六章 计算机的运算方法
  3. uniApp实现二维码带中间logo图(uQRCode插件)
  4. 中国数控机床行业市场竞争态势及投资战略规划报告2022-2028年版
  5. C#使用DevExpress中的chartcontrol
  6. vb连接mysql数据库报错_vb6连接mysql数据库
  7. 开关电源设计书籍推荐
  8. 海康威视错误代码说明(四)(错误代码:47~62)
  9. 诊所 金卫系统 青岛_金卫体检信息管理系统
  10. 数据库设计-逻辑结构设计