小学数学嫌疑人问题C语言解法

发布时间 2023-05-21 17:27:05作者: 1/3Sh

  今日闲翻小学数学书,看到一个比较有意思的逻辑问题。刚好在学C,故写此代码。

  原题:警察抓住了4个偷东西的嫌疑人,其中的一个人是主谋。审问谁是主谋时,甲说:我不是主谋。乙说:丁是主谋。丙说:我不是主谋。丁说:甲是主谋。已知他们4人中只有一个人说了真话。主谋是谁?

 1 #include <stdio.h>
 2 #include <stdbool.h>
 3 
 4 int main()
 5 {
 6     // 假设 A、B、C、D 分别表示甲、乙、丙、丁,M 表示主谋
 7     bool A, B, C, D, M;
 8 
 9     // 遍历所有可能的情况,共有 16 种
10     for (int i = 1; i < 16; i*=2)
11     {
12         // 用二进制位来表示每个人是否是主谋
13         A = i & 1;
14         B = i & 2;
15         C = i & 4;
16         D = i & 8;
17         M = A || B || C || D; // 主谋必须是四个人中的一个
18 
19         // 判断每个人的说法是否为真
20         bool A_says = (A != M);
21         bool B_says = (D == M);
22         bool C_says = (C != M);
23         bool D_says = (A == M);
24 
25 
26         
27         if (A_says && !B_says && !C_says && !D_says) {
28             printf("甲说的是真话:");
29             break;
30         }
31         if (!A_says && B_says && !C_says && !D_says) {
32             printf("乙说的是真话:");
33             break;
34         }
35         if (!A_says && !B_says && C_says && !D_says) {
36             printf("丙说的是真话:");
37             break;
38         }
39         if (!A_says && !B_says && !C_says && D_says) {
40             printf("丁说的是真话:");
41             break;
42         }
43 
44     }
45     int result = A * 8 + B * 4 + C * 2 + D;//利用加法运算符将4个Bool变量组合。
46     switch (result) {
47     case 8: printf("甲是凶手!"); break;
48     case 4: printf("乙是凶手!"); break;
49     case 2: printf("丙是凶手!"); break;
50     case 1: printf("丁是凶手!"); break;
51     }
52 }