#include <iostream>
#include <math.h>using namespace std;#define numnum 14
int coin[numnum] = {2,2,2,2,2,2,2,2,2,2,1,2,2,2};/*计算总重量 */
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_Coin2(int coin[], int coinNum, int low, int high)
{int mid = coinNum/2;          //计算中值int r = coinNum % 2;    //求余数,分别处理奇数偶数情况if (r == 0)                //当硬币刚好分为两组时{int index = 0;int A, B;A = Weight_Sum(coin, low, low + mid - 1);B = Weight_Sum(coin, low + mid, high);if (coinNum == 2){if(A<B){index = low;}else{index = low+1;}return index;}else{if (A > B){index = Weight_Coin2(coin, mid, low + mid, high);return index;}else{if(A==B){return high;}index = Weight_Coin2(coin, mid, low, mid - 1);return index;}}}if (r == 1)           //处理奇数情况{int index = high;int A, B;A = Weight_Sum(coin, low, low + mid - 1);B = Weight_Sum(coin, low + mid, high-1);    //保证ab两个组硬币个数相同if (coinNum == 3)           //当硬币为三个分组时的处理{if(A==B){return high;}else if(A<B){return low;}else{return low+1;}}else{if (A == B)       //当两组硬币的重量相等时{index = high;return index;}else if (A<B)       //假币在A组中的情况{index = Weight_Coin2(coin, mid, low, low+mid-1);return index;}else       //假币在b组中的情况{index = Weight_Coin2(coin, mid, mid, high-1);return index;}}}return 0;
}/* 三分法,找出假币数组下标*/
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);                 //划分,数组下标从0开始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;          //index的值为high,与上面的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 - 1);         //划分三组,多了一个硬币,所以把最后一个硬币单独作为一组if (coinNum == 1)               //当只剩下一个硬币的时候,这个硬币即为假币,返回它的下标{return index;}else              //硬币个数多于一个时{if (A == B){if (A == C)          //但三组硬币的重量相等,则说明最后一枚硬币为假币,返回其下标return index;if ((A < C || A > C))         //另外的一种情况,假币在c组中{index = Weight_Coin(coin, k, low + 2 * k, high - 1);return index;}}else if (A == C)       //假币在b组中{index = Weight_Coin(coin, k, low + k, low + 2 * k - 1);return index;}else          //假币在a组中{index = Weight_Coin(coin, k, low, k - 1);return index;}}}if (r == 2)          //当恰好多出两个硬币的情况{int index = 0;                //设置三个index,与上面的分别设置index为0和high的区别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))       //假币在c组中的情况{index = Weight_Coin(coin, k, low + 2 * k, high - 2);return index;}else if (A == C)       //假币在b组中的情况{index = Weight_Coin(coin, k, low + k, low + 2 * k - 1);return index;}else                   //假币在a组中的情况{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+1 << "  并且假币偏轻" << endl;else if (coin[number] > campareble)cout << "假币的位置为 " << number+1 << "  并且假币偏重" << endl;elsecout << "参照出错" << endl;
}int main()
{int number;number = Weight_Coin(coin, numnum, 0, numnum - 1);//Judge(number);cout<<number<<endl;number = Weight_Coin2(coin,numnum,0,numnum-1);cout<<number<<endl;return 0;
}

假币问题(二分法与三分法实现)相关推荐

  1. 二分法、三分法的详解

    二分法.三分法的详解 这两种方法都是对数据查找的一种高效率方式 二分法 二分查找是一种算法,也叫折半查找,在某些情况下相比较顺序查找,使用二分法查找的效率更高,但是使用该算法的前提是:查找的数据必须是 ...

  2. c语言二分法查找一个数_算法竞赛小专题系列(1):二分法、三分法

    本系列是这本算法教材的扩展资料:<算法竞赛入门到进阶>. 罗勇军.郭卫斌. 清华大学出版社 二分法和三分法是算法竞赛中常见的算法思路,本文介绍了它们的理论背景.模板代码.典型题目. 1. ...

  3. 二分法、三分法 --算法竞赛专题解析(1)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

  4. 三分法解决假币问题(JAVA)

    一,问题描述 有n个硬币,其中有一枚是假币,假币比真币要轻,现有一天平,通过比较找出假币. 二,三分法思路 1.将硬币分为三堆,每堆按照n/3向上取整个硬币来分配(主要分配前两堆,第三堆就是剩下的) ...

  5. 第79篇 C++实现未知假币重量的假币问题(一)三分法

    第79篇 C++实现未知假币重量的假币问题(一)三分法 1.假币问题描述 2.三分法实现思路 3.代码实现 4.结语 1.假币问题描述 在n枚外观相同的硬币中,有一枚硬币是假币,但是不知道假币的重量是 ...

  6. 二分法与黄金分割法matlab代码

    注:二分法与黄金分割法只适用于单峰函数 二分法求 f(x)=8x^3-2x-7x+3 在区间x=[0,1] 的最小值 试探点的求法:x1=(a+b)/2-e/2 x2=(a+b)/2+e/2 其中e是 ...

  7. 二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...

    还记得两三年前,我初看一本算法书,看到二分查找算法的复杂度时,我发现了了不得的东西:二分查找每次查询范围减少一半,需要查询的次数是 ,它的复杂度是 . 我把它改成三分查找,每次查询两个数字与我的目标数 ...

  8. 菜鸟在学编程__LSJ

    1.arr[i]-arr[j] = (arr[i]-arr[i+1])+(arr[i+1]-arr[i+2])+......(arr[j-1]-arr[j]) 该种转换应用:求最小正子串 2.arr[ ...

  9. 二分查找 vs. N分查找

    二分查找   二分查找(Binary Search)又称折半查找,是一种高效率的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 二分查找原理   满足表中元素有 ...

  10. 建仓价和持仓价的应用:如何开仓如何持仓

    建仓.持仓,是交易中绕不开的话题,没有建仓.持仓,何来建仓价.持仓价呢?所以这也是基础问题.不过作为市场形式的表现来说,建仓.持仓到后来的平仓贯彻始终,虽然是基础问题,也是后面登堂入室.继续深造的问题 ...

最新文章

  1. window.onload和$(document).ready()区别很大……
  2. 国内常见的电子地图坐标介绍
  3. python中的模块原则_python 的模块与包
  4. 转:C# Interview Questions
  5. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志
  6. 理解快速生成树协议(RSTP)(二)
  7. 【工具】FormatUtil.ava 常用工具类
  8. MongoDB 之聚合函数查询统计
  9. Web渗透测试----4、常见解析漏洞
  10. python 椭圆曲线dh密钥交换_密钥交换之DH算法
  11. 收集广州周边徒步线路
  12. 计算机年龄测试题,我的世界:五道测试题,看看你游戏时间是否和MC年龄相当...
  13. 完了!Python黄了! 80%的程序员:痛快!你怎么看?
  14. 大数据学习之路(转载)
  15. ubuntu20.04下好用的截图软件
  16. 招投标体统JAVA源代码,JSP 招投标管理系统(毕业设计)源码
  17. 12、Stay_Hungry__Stay_Foolish(译文)
  18. property_get/property_set函数使用
  19. 企业级旅行App源码、高仿爱鲜蜂源码、iOS Arkit测距源码等
  20. 双色球笔记1--输出所有双色球号码

热门文章

  1. 【NOIP2015普及组】推销员
  2. mac10.9下eclipse的storm开发环境搭建
  3. 如何解读羊毛出在了猪身上的保理业务?
  4. python是猿辅导还是学而思_综合分析:猿辅导和学而思对比选哪个好,我的亲身感受...
  5. 笔试题(求一组数中能构成三角形的个数,不能重复)
  6. Ipone桌面计算机没了,苹果笔记本桌面图标不见了怎么办
  7. Linux同步系统时间
  8. netbeans java中文_netbeans中文乱码解决方案
  9. halcon自动对焦
  10. js实现简易打点计时器