哈喽啊大家晚上好!今天要给大家分享的也是C语言中的经典题目——谁是小偷。原题如下:
有五个人,A、B、C、D、E,因为某种原因,有人偷走了公司的一笔钱。以下是五个人的证言: A说:“不是我偷的。” B说:“C是小偷。” C说:“小偷肯定是E。” D说:“我没有偷,这是我的保证。” E说:“B说的不对,我不是小偷。”请写一个程序,判断谁是小偷?
下面是思路分析:
从五个人中找到说谎者和小偷。
-
假设A是小偷,根据五个人的证言,可知只有B的证言与A不符,因此排除此假设。
-
假设B是小偷,根据五个人的证言,可知C的证言与B不符,因此排除此假设。
-
假设C是小偷,根据五个人的证言,可知E的证言与C不符,因此排除此假设。
-
假设D是小偷,根据五个人的证言,可知没有人指认D是小偷,因此排除此假设。
-
假设E是小偷,根据五个人的证言,可知B的证言与E不符,因此排除此假设。
因此,只能得出结论:C是小偷。
最后,我们把思路转换成代码,代码如下:
#include <stdio.h>
int main() {
int suspect = 0;
for (int i = 0; i < 5; i++) {
char name;
int statement;
printf("请输入第%d个人的姓名(A、B、C、D、E)和陈述(0表示不是小偷,1表示是小偷):", i + 1);
scanf("%c %d", &name, &statement);
getchar(); //读取换行符
if (statement == 1) { //如果是小偷
switch (name) {
case 'A':
case 'B':
case 'D':
suspect++; //不符合条件的证言数+1
break;
case 'C':
break;
case 'E':
suspect += 2; //不符合条件的证言数+2
break;
}
}
else { //如果不是小偷
switch (name) {
case 'A':
case 'C':
case 'D':
break;
case 'B':
suspect++;
break;
case 'E':
suspect += 2;
break;
}
}
}
if (suspect == 1) { //只有一个人的证言和其他人不符合
printf("小偷是C!\n");
}
else {
printf("无法确定小偷!\n");
}
return 0;
}
好啦,今天的分享到此结束,大家明天见啦!