推理问题(c语言实现)

1.5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果

  A选手说:B第一,我第三。

  B选手说:我第二,E第四。

  C选手说:我第一,D第二。

 D选手说:C最后,我第三。

 
  E选手说:我第四,A第一。

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

  题目分析:看到这个题目,我们应该能想到利用多层for循环,然后再加个上边的条件进行判断;当你这样做并且

在编译器下跑时,你会发现会出现各种各种的结果,比如,1,2,4,4,5(假设这是五名运动员A,B,C,D,E的比赛排

,这明显是不对,这组数不连续,(日常生活中的比赛排名是这样,1,1,3,4,5,在此我们认为名次连续,即是

1,1,2,3,4)所以,我们就需要判断一组数是否连续,功能强大的位运算符就可以做到。

代码展示:


  1. #define _CRT_SECURE_NO_WARNINGS 1  
  2. #include<stdio.h>  
  3. int main()  
  4. {  
  5.     int a = 1;  
  6.     int b = 1;  
  7.     int c = 1;  
  8.     int d = 1;  
  9.     int e = 1;  
  10.     int flag = 0;  
  11.     int n = 0;  
  12.     for (a = 1;a <= 5;a++)  
  13.     {  
  14.         for (b = 1;b <= 5;b ++)  
  15.         {  
  16.             for (c = 1;c <= 5;c++)  
  17.             {  
  18.                 for (d = 1;d <= 5;d++)  
  19.                 {  
  20.                     for (e = 1;e <= 5;e++)  
  21.                     {  
  22.                             if (((a == 3) + (b == 1) == 1) &&  
  23.                                 ((b == 2) + (e == 4) == 1) &&  
  24.                                 ((c == 1) + (d == 2) == 1) &&  
  25.                                 ((c == 5) + (d == 3) == 1) &&  
  26.                                 ((e == 4) + (a == 1) == 1))  
  27.                            {  
  28.                                 flag = 0;  
  29.                                 n |= (1 << (a - 1));  
  30.                                 n |= (1 << (b - 1));  
  31.                                 n |= (1 << (c - 1));  
  32.                                 n |= (1 << (d - 1));  
  33.                                 n |= (1 << (e - 1));  
  34.                                 while (n)  
  35.                                 {  
  36.                                       
  37.                                     if (n % 2 == 0)  
  38.                                         flag = 1;  
  39.                                     n /= 2;  
  40.                                 }  
  41.                                 if(flag == 0)</span>  
  42.                                    printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);  
  43.                             }  
  44.                         }  
  45.                     }  
  46.                 }  
  47.             }  
  48.         }  
  49.       
  50.     system("pause");  
  51.     return 0;  
  52. }  
代码分析:代码加红部分是程序重点。

                   比如,a=2,b=3,c=1,d=4,e=4是符合if条件的组合,我们来看这组数是否是连续的。我们可以设定五位                        bits就足够,当名次组成的二进制数中,1的中间夹有0,便认为该组数据不符合要求。
                         设n=0;00000000(只画出低八位)
                        a=2;n|=(1<<(2-1)),此时n=00000010
                        b=3;n | = (1<<(3-1));此时n=00000110
                        剩下的数据自己分析一下,最后n=00001111
                        低4位连续为1,(判断方法模除法见代码)
                       再如,n=00001110,是不符合要求的,第一名没人得,后边几名都有人,这是不可能的。

   注意,每次进入if条件判断,成立后,标志位flag需重置零。if语句的加号不可替换成||(1||1 == 1)。

2.日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。

代码展示:


  1. int main()  
  2. {  
  3.     char c;//c是嫌疑犯  
  4.     for (c='a';c<='d';c++)  
  5.     {  
  6.         if ((c != 'a') + (c == 'c') + (c == 'd') + (c != 'd') == 3) {  
  7.             printf("%c是犯罪嫌疑\n", c);  
  8.             break;      }  
  9.     }  
  10.     system("pause");  
  11.     return 0;  
  12. }  
代码分析:此题亦可用位运算符来完成,比如,a说不是他。此时二进制序列为01 1 1(嫌疑犯记为1),b说,00 1 0,c说00 0 1,d说,11 1 0,由于3个人说了真话,所以断定是c。有兴趣的自己实现一下。

           本人是初学者,如以上有不合理的地方,还请指出~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值