转自巫_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为最终结果。



代码实现:

[cpp]  view plain copy
  1. #include<iostream>
  2. using namespace std;
  3. //函数声明
  4. void eightcoin(int arr[]);
  5. void compare(int a, int b,int real, int index1,int index2);
  6. void print(int jia, int zhen, int i);
  7. int main()
  8. {
  9. int i = 0;
  10. int arr[8];
  11. //这里输入a、b、c、d、e、f、g、h的重量
  12. cout<<"请输入八枚硬币:"<<endl;
  13. for(i; i < 8; i++)
  14. {
  15. cin>>arr[i];
  16. }
  17. eightcoin(arr);
  18. system("pause");
  19. return 0;
  20. }
  21. /**
  22. *  八枚硬币问题描述:
  23. *,有一枚是假币,并且已知假币与真币的重量不同
  24. *,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币
  25. *,设计一个高效的算法来检测出这枚假币
  26. * @date:2013/4/27
  27. * @author:wwj
  28. */
  29. void eightcoin(int arr[])
  30. {
  31. //1. 取数组中的前6个元素分为两组进行比较abc,def
  32. //会有a+b+c > d+e+f | a+b+c == d+e+f | a+b+c < d+e+f 三种情况
  33. int abc = arr[0] + arr[1] + arr[2];
  34. int def = arr[3] + arr[4] + arr[5];
  35. int a = arr[0];
  36. int b = arr[1];
  37. int c = arr[2];
  38. int d = arr[3];
  39. int e = arr[4];
  40. int f = arr[5];
  41. int g = arr[6];
  42. int h = arr[7];
  43. if(abc > def)        //6枚硬币必有一枚假币,g,h为真币
  44. {
  45. if((a + e) > (d + b))    //去掉c,f,且b,e互换后,没有引起天平变化,说明假币必然是a,d中的一个
  46. {
  47. compare(a, d, g,1,3);
  48. }
  49. else if((a + e) == (d + b))
  50. {
  51. compare(c,f,g,2,5);
  52. }
  53. else
  54. {
  55. compare(b,e,g,1,4);
  56. }
  57. }
  58. else if(abc == def) //假币在g,h之中,最好状态
  59. {
  60. if(g == a)
  61. {
  62. print(h,g,7);
  63. }
  64. else
  65. {
  66. print(g,h, 6);
  67. }
  68. }
  69. else                //abc < def 这两组存在一枚假币,g,h为真币
  70. {
  71. if((a + e) > (d + b))
  72. {
  73. compare(b,e,g,1,4);
  74. }
  75. else if((a + e) == (d + b))
  76. {
  77. compare(c,f,g,2,5);
  78. }
  79. else
  80. {
  81. compare(a, d, g,1,3);
  82. }
  83. }
  84. }
  85. /**
  86. * 取出可能有一枚假币的两枚假币,作为参数a和参数b
  87. * real表示真币的重量,index1为第一枚硬币的下标,index2为第二枚硬币的下标
  88. */
  89. void compare(int a, int b,int real, int index1,int index2)
  90. {
  91. if(a == real)
  92. {
  93. print(b,real,index2);
  94. }
  95. else
  96. {
  97. print(a, real,index1);
  98. }
  99. }
  100. void print(int jia, int zhen, int i)
  101. {
  102. if(jia > zhen)
  103. {
  104. cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏重!";
  105. }
  106. else {
  107. cout<<"位置在:"<<(i + 1)<<"是假币!"<<"且偏轻!";
  108. }
  109. }

验证结果:



算法设计--八枚硬币问题相关推荐

  1. python八枚硬币问题

    用python写算法之八枚硬币问题 先来看算法要求: 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一 ...

  2. 算法设计与分析之八枚硬币问题

    实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币. 实验目的 1.深 ...

  3. 算法分析与设计:贪心算法实现最少硬币找钱问题(支付+找零共花费硬币数最少)

    硬币找钱问题 Problem Description 设有六种不同面值的硬币,各硬币的面值分别为 5分,1角,2角,5角,1元,2元.现要用这些面值的硬币来购物和找钱.购物时可以使用的各面值的硬币个数 ...

  4. 算法设计与分析: 4-11 硬币找钱问题

    4-11 硬币找钱问题 问题描述 设有 6 种不同面值的硬币,各硬币的面值分别为 5 分,1 角,2 角,5 角,1 元,2 元. 现要用这些面值的硬币来购物和找钱.购物时可以使用的各种面值的硬币个数 ...

  5. 减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况

    八枚硬币问题 在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币. 我们先假 ...

  6. C/C++ 算法设计与分析实验报告

    算法设计与分析实验报告 算法实验整体框架的构建 菜单代码块 选择函数代码块 主函数代码块 实验模块Ⅰ:算法分析基础--Fibonacci序列问题 实验解析 Fibonacci序列问题代码块 实验模块Ⅱ ...

  7. ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)

    [0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...

  8. 一个猜拳游戏的算法设计

    为什么80%的码农都做不了架构师?>>>    一个猜拳游戏的算法设计 我一直都不太喜欢赌博,除了现实中我打赌从没赢过和对电子游戏设备的不信任外,自从在赌场见过老虎机已经变得如此复杂 ...

  9. 1123581321递归算法java_经典算法设计方法

    本文转自博客园 一.什么是算法 算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.算法常常含有重复的步骤和一些比较或逻辑判断.如果一个算法有缺陷,或不适合于 ...

最新文章

  1. 深度学习--TensorFlow (1)单层感知器1 -- 实现单数据训练
  2. loadrunner用javavuser进行接口测试
  3. ISME:基于大数据准确预测土壤的枯萎病发生
  4. 计算机办公应用适合什么工作,有什么软件堪称办公神器,让你每天的工作轻松不累?...
  5. jspServlet(2)
  6. HAPPY_TOGETHER_WEEK15_ENJOY
  7. 一篇博客读懂设计模式之---工厂模式
  8. 后台长期运行进程的三种方式
  9. 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation
  10. DevExpress v17.2新版亮点—Analytics Dashboard篇(一)
  11. 使用OUTPUT从句从SQL Server表删除和归档大量记录
  12. ios图文详情加载html_IOS WKWebView加载本地H5以及css,js等样式
  13. java 汉字笔画_java如何获取笔画
  14. signal信号的处理过程
  15. CSS中添加背景图+盒子边框样式
  16. JLink的RTT使用
  17. ul、li显示图片标记
  18. 阿飞学习mina框架
  19. 杰里之升级复位可以选择软复位跳转和绝对地址跳转【篇】
  20. 李宗盛——给自己的歌,两个版本吉他谱

热门文章

  1. 瀑布模型,v模型与双V模型
  2. GoLand HTTP Proxy 代理设置问题
  3. PRNG伪随机数的破解方法
  4. 有哪些降噪耳机推荐?主动降噪耳机盘点
  5. 统计学 分布篇 - Uniform Probability Distribution(均匀分布)
  6. 汇编总结(4)——字符串操作和位操作
  7. 视频融合平台EasyCVR电子地图增加鼠标悬停展示经纬度
  8. python界面开发案例:制作一个计算器软件
  9. 【回溯】B035_LQ_k调数列的个数(全排列+剪枝)
  10. 踪视通惊艳亮相首届网络实时通信大会, 完美技术引爆全场