C语言习题

来源:互联网 发布:windows系统原理 编辑:程序博客网 时间:2024/04/24 19:14

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第一,我第三。
B选手说:我第二,E第四。
C选手说:我第一,D第二。
D选手说:C最后,我第三。
E选手说:我第四,A第一。
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
要判断这五个人的名次,首先先列出所有可能,这里就需要用5 个循环了。
接下来就是判断每位选手都说对了一半。

#include <stdio.h>int main(){    int a=0,b=0,c=0,d=0,e=0;    for(a=1;a<=5;a++)    {        for(b=1;b<=5;b++)        {            for(c=1;c<=5;c++)            {                for(d=1;d<=5;d++)                {                    for(e=1;e<=5;e++)                    {                        if(((b==1)+(a==3)==1)&&((b==2)+(e==4)==1)&&                           ((c==1)+(d==2)==1)&&((c==5)+(d==3)==1)&&                           ((e==4)+(a==1)==1))                        {                                printf("A是第%d名,B是第%d名,C是第%d名,D是第%d名,E是第%d名\n",a,b,c,d,e);                        }                    }                }            }        }    }    return 0;}

if里面是判断名词的条件,因为每位选手都只说对了一半,所以就用加法来筛选,只有1+0或是0+1才等于1。又因为每位选手都一定有一句话是对的,这里就需要&了,&的意思是按位与,只有每个条件都正确,结果才能为1,若是采用加号,那么就有可能出现2+0=2的情况,这里必须是1+1=2。
若是在此时运行程序,那么还是会有很多的结果,那么我们就在需要一次筛选了,选出那些名次中有一个或几个是空缺的。

if(((b==1)+(a==3)==1)&&((b==2)+(e==4)==1)&&                           ((c==1)+(d==2)==1)&&((c==5)+(d==3)==1)&&                           ((e==4)+(a==1)==1))                        {                            int num=0;                            num |=1<<(a-1);                            num |=1<<(b-1);                            num |=1<<(c-1);                            num |=1<<(d-1);                            num |=1<<(e-1);                            while(num>0)                            {                                if(num%2==0)                                    break;                                num /=2;                            }                            if(num==0)                                printf("A是第%d名,B是第%d名,C是第%d名,D是第%d名,E是第%d名\n",a,b,c,d,e);                        }

如果a的名词是第一名,就将1向左移动一位的值赋给num,再将 num与之前的num按位或,
例如如果排名是1,2,3,4,5
那么最后的num是11111
如果其中有一个名次没有出现,那么num会变成11011,或10111或是其他的可能。
这时再判断一次,把num除2取余,若是等于0,那就代表名词不连续,那么就break,直到名次连续,这时的num=0,就可以输出了。

0 0
原创粉丝点击