#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct number
{
int data;
int begin;
}number;
void Initialize(int *num)
{
int i,j;
time_t t;
for(i=0;i<81;i++)
num[i]=0;
srand((unsigned)time(&t));
j=rand()%81;
num[j]=1;
printf("\n随机假硬币的位置是:%d",j);
}
void Sunnum(int *num,int n,int start,number *a)
{
int i,j=0;
for(i=start;i<(start+n);i++)
j=j+num[i];
a->data=j;
a->begin=start;
}
void main()
{
int NUM[81];
number a[3];
int i,j,m;
printf("**************************************\n");
printf("* 硬币游戏 *\n");
printf("* (戎亮08-10-2) *\n");
printf("*有81枚硬币,其中有一个是假的(随机的生*\n");
printf("*成一枚),用4次称量,把一枚假硬币找出来*\n");
printf("* *\n");
printf("* #欢迎使用# *\n");
printf("**************************************\n");
while(1)
{
printf("\n\n****请选择操作类型(1,开始游戏 2,结束操作):");
while(1)
{
while (scanf("%d",&i)!=1)
{
while (getchar()!='\n'); //将废字符扬弃
printf("\n输入有误,请重新选择:");
}
if((i!=1)&&(i!=2)) printf("\n输入有误,请重新选择:");
if(1==i) break;
if(2==i) {printf("\n****谢谢使用!****\n");exit(0);}
}
Initialize(NUM);
j=27;
m=0;
for(i=0;i<4;i++)
{
printf("\n第%d次将%d个硬币平均分成3组,每组%d个,进行比较,并选择特殊组进行下次分组比较",i+1,j*3,j);
Sunnum(NUM,j,m,&a[0]);
Sunnum(NUM,j,m+j,&a[1]);
Sunnum(NUM,j,m+j+j,&a[2]);
a[0].data==a[1].data?m=a[2].begin:(a[0].data>a[1].data?m=a[0].begin:m=a[1].begin); //进行比较,如果被称量的两组一样重,选择剩下的一组
//进行下次的分组称量,否则选择其中重量重的进行下次分组称量
printf("\n第%d次称量后剩下:%d---%d",i+1,m,m+j-1);
j=j/3;
printf("\n第%d次称量后:%4d,%4d,%4d\n***************************\n",i+1,a[0].data,a[1].data,a[2].data);
}
printf("\n经过4次称量后确定假硬币位置为:%d\n",m);
}
}
评论0
最新资源