实验四——减治法求解假币问题

原创 2018年04月15日 21:46:04

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

提示:将硬币分成ABC三组,如果A等于C,则假币在B组,递归将B三等分,重复上述步骤;如果A不等于C,则假币在AC中,分别将ABCB比较,哪个不等于B,则假币必在其中,递归将其三等分,重复上述步骤。注意,当分组里的硬币数少于3个时,无须划分,直接将组里某个硬币与组外任一硬币比较,不同即是假币,相同的话说明另外一个必是假币。

#include <iostream>
using namespace std;

#define numnum  9

int coin[numnum] = {2,2,2,2,2,2,2,3,2};
int Number_Sum(int arr[],int low,int high)
{
	int sum = 0;
	for(int i = low;i<=high;i++)
		sum += arr[i];
	return sum;
}

int nCoin(int coin[], int n, int low, int high)
{
	int k = n/3;
	int Remain = n%3;

	if(Remain == 0)                                         ////余数为零的情况!
	{
		int index = 0;
		int A,B,C;
		A = Number_Sum(coin,low,low+k-1);
		B = Number_Sum(coin,low+k,low+2*k-1);
		C = Number_Sum(coin,low+2*k,high);

		//cout<<A<<B<<C<<endl;

		if(n == 3)
		{
			if(A==B)
				index = high;
			if(A==C)
				index = high-1;
			if(B==C)
				index = low;
			return index;
		}
		else{
		if(A==B)
		{
			cout<<"reamian0 aaaaabbbbb"<<endl;  
				index = nCoin(coin,k,low+2*k,high);
			return index;
		}
		if(A==C)
		{
			cout<<"reamian0 aaaaaccccc"<<endl;
			index = nCoin(coin,k,low+k,low+2*k-1);
			return index;
		}
		if(B==C)
		{
			cout<<"reamian0 bbbbbcccc"<<endl;
		    index = nCoin(coin,k,low,k-1);
			return index;
		}
		}
	}


	if(Remain == 1)                                          ////余数为1的情况!
	{
		//把最后一个去掉,比较。
	   int index = high;
		int A,B,C;

		if(n==1)
			return high;

		else{
		A = Number_Sum(coin,low,low+k-1);
		B = Number_Sum(coin,low+k,low+2*k-1);
		C = Number_Sum(coin,low+2*k,high-1);

		//cout<<A<<B<<C<<k<<endl;

		if(A==B==C)
			return high;
		else if(A==B)
		{
			cout<<"ramain1 aaaabbb"<<endl;                                  
			index = nCoin(coin,k,low+2*k,high-1);
			return index;
		}
		else if(A==C)
		{
			cout<<"ramain1 aaaaccc"<<endl;   
			index = nCoin(coin,k,low+k,low+2*k-1);
			return index;
		}
		else if(B==C)
		{
			cout<<"ramain1 bbbccc"<<endl;   
			index = nCoin(coin,k,low,k-1);
			return index;
		}
	}
}

	if(Remain == 2)                                        ////余数为2的情况!
	{
	   int index = 0;
	   int index1 = high-1;
	   int index2 = high;
		int A,B,C;
		A = Number_Sum(coin,low,low+k-1);
		B = Number_Sum(coin,low+k,low+2*k-1);
		C = Number_Sum(coin,low+2*k,high-2);
		//cout<<A<<B<<C<<endl;
		if(n<3)
		{
			int campare11 ;
			if(high != numnum-1)
				campare11 = coin[numnum-1];
			else 
				campare11 = coin[0];
			if(coin[high] == campare11)
				index = low;
			if(coin[low] == campare11)
				index = high;
			return index;
		}

		else{
		if(A==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)
		{     
			cout<<"ramain2 aaaabbb"<<endl;   
			index = nCoin(coin,k,low+2*k,high);
			return index;
		}
		else if(A==C)
		{	
			cout<<"ramain2 aaaacccc"<<endl;   
		    index = nCoin(coin,k,low+k,low+2*k-1);
			return index;
		}
		else if(B==C)
		{
			cout<<"ramain2 bbbccc"<<endl;   
			index = nCoin(coin,k,low,k-1);
			return index;
		}
		}
	}
	}

void main()
{
	int number;
	number  = nCoin(coin, numnum, 0, numnum-1);
	int campareble;
	if(number!= numnum-1)
		campareble = coin[numnum-1];
	else 
		campareble = coin[0];
	if(coin[number] < campareble)
		cout<<"假币的位置为 "<<number<<"  并且假币偏轻"<<endl;
	else
		cout<<"假币的位置为 "<<number<<"  并且假币偏重"<<endl;
}

4.8.一些杂散但值得讨论的问题

-
  • 1970年01月01日 08:00

假币算法求解(三分算法和二分算法)

 //**********************************************////        假币算法求解(三分算法和二分算法)//             xwlee 2...
  • Micro_lee
  • Micro_lee
  • 2006-12-21 11:15:00
  • 3384

5 Drease-and-Conquer Fake-Coin Problem(减治法求假币问题)

减治法Decrease and Conquer *Exploring the relationship between a solution to a given instance of (e.g....
  • Brain011
  • Brain011
  • 2015-07-02 23:08:45
  • 1965

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

八枚硬币问题 在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来...
  • qq_39630587
  • qq_39630587
  • 2018-02-02 22:33:40
  • 188

减治法解决假币问题

识别假币问题:在n枚外观相同的假币中,有一枚是假币。在一架天平上,我们可以比较任意两组假币。也就是说,通过观察天平是向右倾、向左倾还是停在当中,我们可以判断出两组硬币重量是否相同,或者哪一组比另一组更...
  • u010925967
  • u010925967
  • 2018-03-16 21:27:04
  • 91

(五)减治法

上节中我们讲述了分治法,分治法是把一个大问题划分为若干子问题,分别求解子问题,然后再把子问题的解进行合并得到原问题的解。而减治法同样是把大问题分解成为若干个子问题,但是这些子问题不需要分别求解,只需求...
  • lovesummerforever
  • lovesummerforever
  • 2014-01-22 08:53:17
  • 4930

实验四——减治法求解假币问题

在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的减治算法来检测出这枚假币。提示:将硬币分成A、...
  • ngl158358
  • ngl158358
  • 2018-04-15 21:46:04
  • 73

C++<em>假币问题</em>实现代码

c++ 8枚硬币问题在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的...5 Drease-and-Conquer Fake-Coin Problem(<em>减治法求假币问题</em>) 减治法解决八枚...
  • 2018年04月17日 00:00

<em>减治法</em>八枚硬币<em>问题</em>

减治法解八枚硬币问题 立即下载 上传者: ronge2 时间: 2009-03-25 综合评分: 5 积分/C币:3 5 Drease-and-Conquer Fake-Coin Problem(<em>减治法求假币问题</em>...
  • 2018年04月18日 00:00

n枚硬币中<em>假币问题</em>

<em>假币问题</em>-<em>减治法</em>在组合问题中的应用 立即下载 上传者: ccqq0418 时间: 2008-12-04 综合评分: 5 积分/C币:3 C++<em>假币问题</em>实现代码 立即下载 上传者: a...
  • 2018年04月03日 00:00
收藏助手
不良信息举报
您举报文章:实验四——减治法求解假币问题
举报原因:
原因补充:

(最多只允许输入30个字)