有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)
#include
#include
#include
#defineLETTER_HEAD97//a的起始
#defineBALL_NUM12//球个数
#defineNORMAL_WEIGHT2//一般球的重量
#defineHIGH_WEIGHT3//球超重
#defineLOW_WEIGHT1//球失重...
#defineLOOP3//循环次数(可称几次)
#defineFALSE-1
#defineTRUE0
intbadBallWeight;
charbadBall;
//得到坏球的字符
chargetBadBall()
{
srand((unsigned)time(NULL));
return(char)(random()ºLL_NUM+LETTER_HEAD);
}
//得到坏球的重量
voidgetBadBallWeight()
{
inttype;
srand((unsigned)time(NULL));
type=random()%2;
if(1==type)
{
badBallWeight=HIGH_WEIGHT;
}
else
{
badBallWeight=LOW_WEIGHT;
}
}
//开启了debug后返回FALSE
intdebug(char*str)
{
if(strcmp(str,"exit")==0)
{
exit(0);
}
if(strcmp(str,"cheat")==0)
{
printf("CHEAT:badballis%c,weightis%d\n",badBall,badBallWeight);
returnFALSE;
}
returnTRUE;
}
//验证球的名字,不在a-l之间的返回FALSE
intverifyBallsName(char*str)
{
char*p;
for(p=str;*p!=’\0’;p++)
{
if(*p’l’)
{
returnFALSE;
}
}
returnTRUE;
}
//验证一侧的球有无重复,重复返回FALSE
intverifySingleRepeat(char*str)
{
char*p,*temp;
intrepeat;
for(p=str;*p!=’\0’;p++)
{
repeat=0;
for(temp=str;*temp!=’\0’;temp++)
{
if(*p==*temp)
repeat++;
}
if(repeat>1)
returnFALSE;
}
returnTRUE;
}
//验证一侧的错误性有错打印并返回FALSE,无错返回有几个球
intverifySingle(char*str)
{
interr;
err=debug(str);
if(FALSE==err)
returnFALSE;
err=verifyBallsName(str);
if(FALSE==err)
{
printf("\nERROR:ballsnameerror(Usage:abcdefghijkl)\n");
returnFALSE;
}
err=verifySingleRepeat(str);
if(FALSE==err)
{
printf("\nERROR:ballsnamerepeat\n");
returnFALSE;
}
returnTRUE;
}:
//得到单侧的重量
intgetSingleWeight(char*str)
{
intballsNum,haveBadBall;
char*p;
ballsNum=strlen(str);
haveBadBall=0;
for(p=str;*p!=’\0’;p++)
{
if(*p==badBall)
haveBadBall++;
}
return((ballsNum-haveBadBall)*NORMAL_WEIGHT+haveBadBall*badBallWeight);
}
intverifyMultiBallName(char*leftStr,char*rightStr)
{
char*l,*r;
for(l=leftStr;*l!=’\0’;l++)
{
for(r=rightStr;*r!=’\0’;r++)
{
if(*l==*r)
returnFALSE;
}
}
returnTRUE;
}
intmain()
{
intloopTime,err;
intleftWeight,rightWeight;
charleft[128],right[128];
charbad[16];
printf("有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),\
而且该球不知道是轻点还是重点。现在给你一个天平(无砝码),只有3次测量机会,请你找出该球。球号从a到l(小写)\n");
badBall=getBadBall();
getBadBallWeight();
for(loopTime=1;loopTime<=LOOP;loopTime++)
{
printf("plsinputleftballs:");
scanf("%s",left);
err=verifySingle(left);
if(FALSE==err)
gotoerror;
leftWeight=getSingleWeight(left);
printf("plsinputrightballs:");
scanf("%s",right);
err=verifySingle(right);
if(FALSE==err)
gotoerror;
rightWeight=getSingleWeight(right);
err=verifyMultiBallName(left,right);
if(FALSE==err)
{
printf("\nERROR:oneballbothinleftandright\n");
gotoerror;
}
if(leftWeight>rightWeight)
{
printf("result%d:left>right\n",loopTime);
}
elseif(leftWeight
{
printf("result%d:left
}
else
{
printf("result%d:left=right\n",loopTime);
}
continue;
error:
loopTime--;
}
printf("plsinputthebadballname:");
scanf("%s",bad);
if(*bad==badBall)
{
printf("\ncongratulation,yourselectedisright!\n");
}
else
{
printf("\nsorry,yourselectediswrong!\n");
}
return0;
}