C语言习题

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

#include 
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,就可以输出了。

你可能感兴趣的:(C语言)