这个问题吧,关键是算法,还有那个“利用一次关系运算结果真假算一次”,那么每个for循环算不算一次?如果知道是固定8个还好,不固定的话,肯定要循环调用。我试着使用了递归来计算,递归的开头就需要判断一下是不是只有1个数了,那么这个判断if (n==1)是否算一次?
我的思路是这样的,取第一个数为“伪”基准值,然后把N个数分2半,两半均等(偶数个)或前一半少1个数(奇数个)。把前半部分n个数加起来,与基准数*n进行比较,如果相等,则问题数在第2部分。否则问题数在第1部分,同时从非问题数那部分取一个数作为基准数,这样递归判断有问题的那部分,直到只有1个数了,就是问题数。
输入:1 1 1 1 1 2 1 1
次数 基准数 需要判断的数 比较 结果 下一次判断
1 1 1 1 1 1 1 2 1 1 1+1+1+1 == 1*4 真 1 2 1 1
2 1 1 2 1 1 1+2 == 1*2 假 1 2
3 1 1 2 1=1*1 真 2
4 1 2 只有一个数,直接返回
这种算法说起来,也没啥效率,如果只有8个数的话,不用递归,不判断是否只有1个数,if...then...else用3次判断出结果即可。
因为没啥效率,而且如果if (n==1)也算一次的话,该判断可以改成if (a[0] == 基准数),这样的话,如果输入是1 1 1 1 2 1 1 1的话,第2次递归就能返回了。
总的来说程序很无趣,钻题目的空子,所以源程序就不帖了。
#include
main()
{ int a[8],i;
while(1){
for(i=0;i<8;i++)
scanf("%d",&a[i]);
if(a[0]==a[1]){
for(i=2;i<8;i++)
if(a[i]!=a[0]){
printf("%d %d次\n",a[i],i);break;
}
}
else{
if(a[0]==a[2]) printf("%d 2次\n",a[1]);
else printf("%d 2次\n",a[0]);
}
}
}//当a[0]=a[1]时,说明不同的一定在a[1]之后,因此用a[1]之
//后的值逐个与a[0](或a[1])比较,直接就比较出不同的了。
//当a[0]≠a[1]时,说明不同的一定在a[0]和a[1]其中一个,因
//此用a[0]在与a[2]比较,如果a[0]=a[2],说明a[1]不同,否
//直接说明a[0]不同,因此只比较了两次。
如图所示,望采纳。。。。。。