其他分享
首页 > 其他分享> > C语言逻辑填空题——审问嫌疑犯

C语言逻辑填空题——审问嫌疑犯

作者:互联网

这是一道填空题,题目选自 中国海洋大学2017年硕士研究生入学考试试题

题目描述:

公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,

还知道这四人中每人说话要么全是真的,要么全是假的。

在回答公安人员的问题中:

甲说:“乙没有偷,是丁偷的。”

乙说:“我没有偷,是丙偷的。”

丙说:“甲没有偷,是乙偷的。”

丁说:“我没有偷。”

请根据这四人的答话编程判断谁是盗窃者。仔细阅读下面的程序并补充完整。

#include<stdio.h>
int main()
{    int i,j,a[4];
     for(int i=0;i<4;i++)
     {    a[i]=1;
          for(j=0;j<4;j++) if( //填空1 ) a[j]=0;
          if(a[1]+a[3]==1 && (//填空 2)  && a[0]+a[1]==1)
              printf("The thief is %c.\n",'A'+i);
     }
}

详细分析一下:

题目告诉我们只有一个人是罪犯,所以设置一个int型数组a。

让a遍历所有可能的情况。

对于int a[4] 中 下标0 1 2 3分别对应甲 乙 丙 丁 

而且甲乙丙所说的话都是有两句,要么全为真,要么全为假。

我们用a[i] = 1 来表示 i 是罪犯

以甲所说的话为例 “乙没有偷” 即为 a[1]=0 。“是丁偷的”,即为a[3]=1。

而这两句话要么全为真,要么全为假。

如果为真,那么 a[1] + a[3] = 0 + 1 = 1;

如果为假,那么 a[1] + a[3] = 1 + 0 = 1;

可以看出,对于甲乙丙每个人说的话,无论它是真是假,对应的条件和为1,

(这里可以理解为:甲说的话 无论真假 乙和丁必有一个是罪犯)

所以当甲乙丙每个人说的话 用数组中对应下标的值表示出来都为1时,此时的假设小偷成立

而最后一个丁的叙述对判断没有影响,所以在判断条件那里没有体现出来。

最后输出满足条件时,所对应的值。

公布结果:

第一空: 显然是每次将数组重新赋值,将假设的i变为1,其余全为0

所以答案为:  j != 1 

第二空:同时满足甲乙丙的三种条件

由于空前面是对应甲说的话,空后面对应的是丙说的话

所以填空应该对应乙说的话

即答案为:a[1]+a[2]=1
 

标签:全为,int,要么,填空题,C语言,乙丙,嫌疑犯,对应,的话
来源: https://blog.csdn.net/weixin_44572229/article/details/120828602