例1:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
数学逻辑:由于只有一个人说了假话,其余人都是真话。
- 假设A是嫌疑犯,那么只有A,B,C说了假话,假设不成立。
- 假设B是嫌疑犯,那么B,C均是假话,假设不成立。
- 假设C是嫌疑犯,那么A,B,D说了真话,C说了假话,假设成立
- 假设D是嫌疑犯,那么B,D均是假话,假设不成立
综上:嫌疑犯是C
C语言逻辑:
定义一个字符型变量"thisman"用于存放嫌疑犯的名称,嫌疑犯有可能是A,B,C,D四个中的一个,所以用循环来表示:
又已知三个人说了真话,一个人说了假话,所以三个人说的话相加为3即为真;
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { char thisman; //存放嫌疑人的变量 for (thisman = 'A'; thisman <= 'D'; thisman++) { if (((thisman != 'A') + (thisman == 'C') + (thisman == 'D') + (thisman != 'D')) == 3) printf("thiman is %c\n", thisman); } system("pause"); return 0; }
代码运行如下:
例2:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:
程序应满足以下条件:五位选手说的话仅一半正确且名次不相同;
用A,B,C,D,E,表示五位选手,他们均有可能拿第一到第五五个名次,所以应该有五次循环,
代码如下:
#define _CRT_SERCUE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int A, B, C, D, E; for (A = 1; A <= 5; A++) { for (B = 1; B <= 5; B++) { for (C = 1; C <= 5; C++) { for (D = 1; D <= 5; D++) { for (E = 1; E <= 5; E++) { if ((A + B + C + D + E == 15) && (A*B*C*D*E == 120) && ((B == 2) + (A == 3)==1)&& ((B == 2) + (E == 4)==1) && ((C == 1)+ (D == 2)==1) && ((C == 5) + (D == 3)==1) && ((E == 4) + (A == 1))==1) { printf("A:%d B:%d C:%d D:%d E:%d\n", A, B, C, D, E); } } } } } } system("pause"); return 0; }
代码运行如下: