C语言每日一练——第67天:谁在说谎问题

C语言每日一练
2021年12月12日

题目描述

现有张三、李四和王五3个人,张三说李四在说谎,李四说王五在说谎,而王五说张三和李四两人都在说谎。要求编程求出这3个人中到底谁说的是真话,谁说的是假话。

问题分析

既然要使用编程解决这个问题,那就不要尝试动脑筋去推理,不然要电脑做什么。。。

所以我们可以直接遍历所有可能,将三个人所说的话的真假(说谎变量)定义为整型变量Z、L、W,为0表示说谎,1表示说的是真话。

那怎么判断三个人是否说谎呢?
直接用Z、L、W和他们所说的话做对比就能得出答案:
张三说李四说谎,所以张三说的话就是L == 0,以此类推,就能归纳出如下的表达式(说话表达式):

/* 三个人所说的话 */
#define ZHANSHAN (L == 0)     //李四在说谎
#define LISI     (W == 0)     //王五在说谎
#define WANGWU   (Z == 0 && L == 0) //张三和李四在说谎

将所有说谎变量遍历的结果和上面三个表达式作比较,当三个人的说谎变量说话表达式都匹配时,即当ZHANSHAN == Z && LISI == L && WANGWU == W为真时,就得到了正确答案。

代码实现

#include <stdio.h>

/* 三个人所说的话 */
#define ZHANSHAN (L == 0)     //李四在说谎
#define LISI     (W == 0)     //王五在说谎
#define WANGWU   (Z == 0 && L == 0) //张三和李四在说谎

int main()
{
    /* 张三、李四、王五是否说谎,0表示说谎 */
    int Z = 0, L = 0, W = 0;

    for(Z = 0; Z <= 1; Z++)
        for(L = 0; L <= 1; L++)
            for(W = 0; W <= 1; W++)
            {
                if(ZHANSHAN == Z && LISI == L && WANGWU == W)
                {
                    Z ? puts("张三说的是真话") : puts("张三说的是假话");
                    L ? puts("李四说的是真话") : puts("李四说的是假话");
                    W ? puts("王五说的是真话") : puts("王五说的是假话");
                }
            }

    return 0;
}

运行结果

在这里插入图片描述

网上参考

原文链接:http://c.biancheng.net/cpp/html/3350.html
这份代码的判断条件是我的两倍,个人觉得没这个必要,不过思路都是一样的。

原文思路:在这里插入图片描述

#include<stdio.h>
int main()
{
   int x, y, z;
   for(x=0; x<=1; x++)
       for(y=0; y<=1; y++)
           for(z=0; z<=1; z++)
               if( ((x&&!y) || (!x&&y)) && ((y&&!z) || (!y&&z)) && ((z&&x==0&&y==0) || (!z&&x+y!=0)) )
               {
                   printf("张三说的是%s.n",x?"真话":"假话");
                   printf("李四说的是%s.n",y?"真话":"假话");
                   printf("王五说的是%s.n",z?"真话":"假话");
                  
               }
   return 0;
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>