算法设计--八枚硬币问题
转自巫_1曲待续
八枚硬币问题
问题描述:
在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。
解决思路:
假定输入的八枚硬币:a、b、c、d、e、f、g、h
实验解决思路:把硬币分成三组,从八枚硬币中任取六枚a、b、c、d、e、f,在天平两端各放三枚进行比较。 假设a、b、c三枚放在天平的一端,d、e、f三枚放在天平的另一端,可能出现如图所示的三种比较结果。
实验步骤:
1. 将硬币分为3组:a,b,c、d,e,f、g,h,
2. 分别取a,b,c、d,e,f 放在天平的两侧,现在假设硬币abc重于def,这说明这两组中有一组包含一枚假币,但不确定是在左侧,还是右侧。
3. 由上面的我们已经知道假币在前面两组了,那么剩下的那组的两枚硬币应该是相等的,我们取其中一枚作为考量值,这里取g硬币。取左侧的一枚硬币:a硬币,再取右侧的一枚硬币:e硬币,把ae作为新左侧的硬币组合,再取右侧的一枚硬币:d硬币+考量值:g硬币作为新右侧组合。如果出现重量不等,则可确定:这两组中的一组存在一枚假币,但具体是哪一枚还没有确定。
4. 我们可以通过把a、e、d分别于h比较,假如与h不一样,则这枚硬币为假币,并且可以确定这枚假币是重还是轻。整个解决思路就是这样。
5. 最后结果e与h比较,e不等于h重量,并且较轻,e为最终结果。
代码实现:
- #include<iostream>
- using namespace std;
- //函数声明
- void eightcoin(int arr[]);
- void compare(int a, int b,int real, int index1,int index2);
- void print(int jia, int zhen, int i);
- int main()
- {
- int i = 0;
- int arr[8];
- //这里输入a、b、c、d、e、f、g、h的重量
- cout<<"请输入八枚硬币:"<<endl;
- for(i; i < 8; i++)
- {
- cin>>arr[i];
- }
- eightcoin(arr);
- system("pause");
- return 0;
- }
- /**
- * 八枚硬币问题描述:
- *,有一枚是假币,并且已知假币与真币的重量不同
- *,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币
- *,设计一个高效的算法来检测出这枚假币
- * @date:2013/4/27
- * @author:wwj
- */
- void eightcoin(int arr[])
- {
- //1. 取数组中的前6个元素分为两组进行比较abc,def
- //会有a+b+c > d+e+f | a+b+c == d+e+f | a+b+c < d+e+f 三种情况
- int abc = arr[0] + arr[1] + arr[2];
- int def = arr[3] + arr[4] + arr[5];
- int a = arr[0];
- int b = arr[1];
- int c = arr[2];
- int d = arr[3];
- int e = arr[4];
- int f = arr[5];
- int g = arr[6];
- int h = arr[7];
- if(abc > def) //6枚硬币必有一枚假币,g,h为真币
- {
- if((a + e) > (d + b)) //去掉c,f,且b,e互换后,没有引起天平变化,说明假币必然是a,d中的一个
- {
- compare(a, d, g,1,3);
- }
- else if((a + e) == (d + b))
- {
- compare(c,f,g,2,5);
- }
- else
- {
- compare(b,e,g,1,4);
- }
- }
- else if(abc == def) //假币在g,h之中,最好状态
- {
- if(g == a)
- {
- print(h,g,7);
- }
- else
- {
- print(g,h, 6);
- }
- }
- else //abc < def 这两组存在一枚假币,g,h为真币
- {
- if((a + e) > (d + b))
- {
- compare(b,e,g,1,4);
- }
- else if((a + e) == (d + b))
- {
- compare(c,f,g,2,5);
- }
- else
- {
- compare(a, d, g,1,3);
- }
- }
- }
- /**
- * 取出可能有一枚假币的两枚假币,作为参数a和参数b
- * real表示真币的重量,index1为第一枚硬币的下标,index2为第二枚硬币的下标
- */
- void compare(int a, int b,int real, int index1,int index2)
- {
- if(a == real)
- {
- print(b,real,index2);
- }
- else
- {
- print(a, real,index1);
- }
- }
- void print(int jia, int zhen, int i)
- {
- if(jia > zhen)
- {
- cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏重!";
- }
- else {
- cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏轻!";
- }
- }
验证结果:
算法设计--八枚硬币问题相关推荐
- python八枚硬币问题
用python写算法之八枚硬币问题 先来看算法要求: 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一 ...
- 算法设计与分析之八枚硬币问题
实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 实验目的 1.深 ...
- 算法分析与设计:贪心算法实现最少硬币找钱问题(支付+找零共花费硬币数最少)
硬币找钱问题 Problem Description 设有六种不同面值的硬币,各硬币的面值分别为 5分,1角,2角,5角,1元,2元.现要用这些面值的硬币来购物和找钱.购物时可以使用的各面值的硬币个数 ...
- 算法设计与分析: 4-11 硬币找钱问题
4-11 硬币找钱问题 问题描述 设有 6 种不同面值的硬币,各硬币的面值分别为 5 分,1 角,2 角,5 角,1 元,2 元. 现要用这些面值的硬币来购物和找钱.购物时可以使用的各种面值的硬币个数 ...
- 减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况
八枚硬币问题 在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币. 我们先假 ...
- C/C++ 算法设计与分析实验报告
算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...
- ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
[0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...
- 一个猜拳游戏的算法设计
为什么80%的码农都做不了架构师?>>> 一个猜拳游戏的算法设计 我一直都不太喜欢赌博,除了现实中我打赌从没赢过和对电子游戏设备的不信任外,自从在赌场见过老虎机已经变得如此复杂 ...
- 1123581321递归算法java_经典算法设计方法
本文转自博客园 一.什么是算法 算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.算法常常含有重复的步骤和一些比较或逻辑判断.如果一个算法有缺陷,或不适合于 ...
最新文章
- 深度学习--TensorFlow (1)单层感知器1 -- 实现单数据训练
- loadrunner用javavuser进行接口测试
- ISME:基于大数据准确预测土壤的枯萎病发生
- 计算机办公应用适合什么工作,有什么软件堪称办公神器,让你每天的工作轻松不累?...
- jspServlet(2)
- HAPPY_TOGETHER_WEEK15_ENJOY
- 一篇博客读懂设计模式之---工厂模式
- 后台长期运行进程的三种方式
- 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation
- DevExpress v17.2新版亮点—Analytics Dashboard篇(一)
- 使用OUTPUT从句从SQL Server表删除和归档大量记录
- ios图文详情加载html_IOS WKWebView加载本地H5以及css,js等样式
- java 汉字笔画_java如何获取笔画
- signal信号的处理过程
- CSS中添加背景图+盒子边框样式
- JLink的RTT使用
- ul、li显示图片标记
- 阿飞学习mina框架
- 杰里之升级复位可以选择软复位跳转和绝对地址跳转【篇】
- 李宗盛——给自己的歌,两个版本吉他谱