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;
}