判断谁说真话,谁说假话

A,B,C,D,E共5个人围成一圈,每人头上戴了一顶帽子,帽子可能是黑色或白色。戴白帽子的人说真话,戴黑帽子的人说假话。

A说:我看到3个人戴白帽子,1个人戴黑帽子;

B说:我看到4个人戴黑帽子; 

C说:我看到1个人戴白帽子,3个人戴黑帽子;

D说:我看到4个人戴白帽子。

E什么话都没说。

编程计算出这5个人谁戴白帽子、谁戴黑帽子。 

【思路】

戴白帽子算做1(真),戴黑帽子算做0(假)。

那么,如果A戴白帽子,就是B+C+D+E==3;如果A戴黑帽子,就是B+C+D+E!=3。

因此可以得到:((A&&((B+C+D+E)==3)) || (!A&&((B+C+D+E)!=3)))。

同理对B、C、D的说法可以建立计算公式。

最后,遍历A、B、C、D、E的每一种戴帽的可能,把符合计算公式的那些组合值显示出来就可以了。

void findout(void)
{
    int a=0, b=0, c=0, d=0, e=0;

    for(a=0; a<2; a++)
        for(b=0; b<2; b++)
            for(c=0; c<2; c++)
                for(d=0; d<2; d++)
                    for(e=0; e<2; e++)
                    {
                        if((((a==1)&&(b+c+d+e==3)) || ((a==0)&&(b+c+d+e!=3)))&&
                           (((b==1)&&(a+c+d+e==0)) || ((b==0)&&(a+c+d+e!=0)))&&
                           (((c==1)&&(a+b+d+e==1)) || ((c==0)&&(a+b+d+e!=1)))&&
                           (((d==1)&&(a+b+c+e==4)) || ((d==0)&&(a+b+c+e!=4))))
                        {
                            printf("a=%d, b=%d, c=%d, d=%d, e=%d\n", a, b, c, d, e);
                        }
                    }

}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是 C 语言的程序实现。 ```c #include <stdio.h> int main() { int a, b, c; for (a = 0; a <= 1; a++) { for (b = 0; b <= 1; b++) { for (c = 0; c <= 1; c++) { if (b == 0 && a == 1) { continue; } if (a == (b == c) && b == (a != c)) { printf("甲%s,乙%s,丙%s\n", a ? "真话" : "假话", b ? "真话" : "假话", c ? "真话" : "假话"); } } } } return 0; } ``` 运行结果为: ``` 甲假话,乙真话,丙假话 ``` 如果加入“丙:‘甲假话。’”,则程序需要加入判断条件: ```c if (c == (a == 0)) ``` 完整的程序如下: ```c #include <stdio.h> int main() { int a, b, c; for (a = 0; a <= 1; a++) { for (b = 0; b <= 1; b++) { for (c = 0; c <= 1; c++) { if (b == 0 && a == 1) { continue; } if (a == (b == c) && b == (a != c) && c == (a == 0)) { printf("甲%s,乙%s,丙%s\n", a ? "真话" : "假话", b ? "真话" : "假话", c ? "真话" : "假话"); } } } } return 0; } ``` 运行结果为: ``` 甲假话,乙真话,丙真话 ``` ### 回答2: 根据甲和乙的法,可以进行逻辑推理: 假设甲的是真话,那么乙就是假话,因为乙甲和丙是同一种人。 假设甲的是假话,那么乙就是真话,因为乙甲和丙是同一种人。 综上所述,乙的话无论真假,甲的都是假话。 讨论了甲的话之后,考虑乙的话。根据之前的讨论,甲的是假话,而乙甲和丙是同一种人。这就明丙和甲不是同一种人。因此,乙的是假话。 综上所述,甲和乙都的是假话。 如果题目中加入“丙:‘甲假话。’” 根据之前的讨论,甲和乙都的是假话。 再来讨论丙的话,根据之前的讨论,乙的是假话,甲的是假话。而丙“甲假话”,这就意味着丙真话。 综上所述,甲和乙都的是假话,丙的是真话。 如果使用C语言编写程序,则可以用逻辑运算符来进行判断和推理,其中包括“与”(&&)和“或”(||)的组合。 对于第一个问题,程序可以这样编写: ```c #include <stdio.h> int main() { int a,b,c; a = 0; // 表示甲假话 b = (a == 0); // 表示乙的是假话 c = (b != 1); // 表示丙甲和乙不是同一种人 printf("甲的是%s\n", a?"真话":"假话"); printf("乙的是%s\n", b?"真话":"假话"); printf("丙的是%s\n", c?"真话":"假话"); return 0; } ``` 运行结果为: ``` 甲的是假话的是假话的是真话 ``` 对于第二个问题,程序可以这样编写: ```c #include <stdio.h> int main() { int a,b,c; a = 0; // 表示甲假话 b = (a == 0); // 表示乙的是假话 c = (b == 0); // 表示丙的是真话 printf("甲的是%s\n", a?"真话":"假话"); printf("乙的是%s\n", b?"真话":"假话"); printf("丙的是%s\n", c?"真话":"假话"); return 0; } ``` 运行结果为: ``` 甲的是假话的是假话的是真话 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值