伪造硬币问
此代码很有用
共有0人认为此代码有用
伪造硬币问题
鉴客 发布于 2011年04月20日 16时 (2评) 0人收藏此代码, 我要收藏(?)
给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的任务是找出这个
伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪
器,利用这台仪器,可以知道两组硬币的重量是否相同。试用分治法的思想写出解
决问题的算法,并计算其时间复杂度。
#include
#include
#include
#define N 6
void setWrong(int *coin,int n) {
int i;
int ran;
for(i=0;i表示需要找假硬币的数组; param astart 前一个分组的开始; param bstart 后一个分组的开始; param n 每个分组的长度;
*/
int compare(int *coin,int astart,int bstart,int n)
{
int asum=0;
int bsum=0;
int i;
for(i=astart;i
bsum) return 1; }
int find(int *coin,int start,int n)
{
if(n==1)
{
printf("第%d个是假币",start);
return start;
}
if((n%2)==0)
{
if(compare(coin,start,n/2,n/2)==-1) find(coin,start,n/2);
else if(compare(coin,start,n/2,n/2)==0) return -1;
else find(coin,n/2,n/2);
}
else
{
if(compare(coin,start,start+(n-1)/2,(n-1)/2)==-1) find(coin,start,(n-1)/2);
else if(compare(coin,start,start+(n-1)/2,(n-1)/2)==0) find(coin,start+n-1,1);
else find(coin,start+(n-1)/2,(n-1)/2);
}
}
void main()
{
int a[N];
setWrong(a,N);
printf("%d",find(a,0,N));
}