文章目录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#define ZHANSHAN (L == 0) //李四在说谎 #define LISI (W == 0) //王五在说谎 #define WANGWU (Z == 0 && L == 0) //张三和李四在说谎 int main() { 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
这份代码的判断条件是我的两倍,个人觉得没这个必要,不过思路都是一样的。
原文思路:
#includeint 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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)