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