题目
看一道很简单的小学数学题。
警察局抓了A、B、C、D四名偷窃嫌疑犯,其中有一人是小偷。审问中A说:“我不是小偷。”B说:“C是小偷。”C说:“小偷肯定是D。”D说:“C在冤枉人。”现在已经知道四个人中三个人说的是真话,一个人说的是假话,问到底谁是小偷?
这道题派一名小学生来都会做;可是现在要编程求出来,很多人就没思路了。
解题
-
既然A、B、C、D中有一人是小偷,那么我们就先循环遍历这四个人。
for(char t='A'; t<='B'; t++){}
-
现在我们已经遍历出了待定的小偷,接下来就要判断当前待定小偷符不符合条件了。
- 先将每个人说的话都写成表达式,就分别可以得到
'A'!=t
、'C'==t
、t=='D'
、t!='D'
。 - 而,已知有三句话是真话,也就是说这些表达式中有三个表达式的值为
true
(1
)、一个为false
(0
)。 - 那么,我们就只需要将这些表达式全部加起来,判断和是否等于
3
即可。如果成立,就说明当前待定小偷符合条件,直接输出。
if(('A'!=t)+('C'==t)+(t=='D')+(t!='D')==3){ printf("%c", t); }
- 先将每个人说的话都写成表达式,就分别可以得到
完整代码就是这样。
#include<cstdio>
int main(){
for(char t='A'; t<='D'; t++){
if(('A'!=t)+('C'==t)+(t=='D')+(t!='D')==3){
printf("%c", t);
}
}
return 0;
}