/****************************************
* File Name : arithmetic.c
* Creat Data : 2015.1.31
* Author : ZY
*****************************************/
/*Algorithm Gossip:八枚银币*/
/*现有八枚银币a,b,c,d,e,f,g,h,已知其中一枚是假币,
其重量不同于真币,但不知是较轻或较重,如何使用天
平以最少的次数比较,决定出哪枚是假币,并得知假币
比真币较轻或较重*/
/*使用决策树(decision tree),使用分析与树状图来
协助求解。先比较a+b+c与d+e+f,若相等,则假币必为g
或h,我们先比较g或h哪个较重,若g较重,再与a比较,如
果a,g相等,则g为真币,h为假币。*/
#include
#include
#include
void compare(int coins[],int i,int j,int k)//交换硬币,判断假币重量,输出假币是第几个是轻是重
{
if(coins[i] > coins[k])
{
printf("\n假币 %d 较重",i+1);
}
else
{
printf("\n假币 %d 较轻",j+1);
}
}
void eightcoins(int coins[])
{
if(coins[0]+coins[1]+coins[2] == coins[3]+coins[4]+coins[5])
{
if(coins[6] > coins[7])
{
compare(coins,6,7,0);
}
else
{
compare(coins,7,6,0);
}
}
else if(coins[0]+coins[1]+coins[2] > coins[3]+coins[4]+coins[5])
{
if(coins[0]+coins[3] == coins[1]+coins[4])
{
compare(coins,2,5,0);
}
else if(coins[0]+coins[3] > coins[1]+coins[4])
{
compare(coins,0,4,1);
}
else if(coins[0]+coins[3] < coins[1]+coins[4])
{
compare(coins,1,3,0);
}
}
else if(coins[0]+coins[1]+coins[2] < coins[3]+coins[4]+coins[5])
{
if(coins[0]+coins[3] == coins[1]+coins[4])
{
compare(coins,5,2,0);
}
else if(coins[0]+coins[3] > coins[1]+coins[4])
{
compare(coins,3,1,0);
}
else if(coins[0]+coins[3] < coins[1]+coins[4])
{
compare(coins,4,0,1);
}
}
}
int main(void)
{
int coins[8] = {0};
int i;
srand(time(NULL));//随机数
for(i = 0;i < 8;i++)
{
coins[i] = 10;
}
printf("\n输入假币的重量(比10大或小):");
scanf("%d",&i);
coins[rand()%8] = i;//随机数
eightcoins(coins);
printf("\n\n列出所有钱币重量:");
for(i = 0;i < 8;i++)
{
printf("%d ",coins[i]);
}
printf("\n");
return 0;
}