求大佬帮编写一个C语言程序

2025-03-04 06:18:03
推荐回答(2个)
回答1:

这个问题吧,关键是算法,还有那个“利用一次关系运算结果真假算一次”,那么每个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次递归就能返回了。

总的来说程序很无趣,钻题目的空子,所以源程序就不帖了。

回答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]不同,因此只比较了两次。

如图所示,望采纳。。。。。。