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 != i 

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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是一只派大鑫

一块两块不嫌少,三块四块不嫌多

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值