c语言谁在说谎的编程,C语言谁在说谎问题代码及解析

问题描述

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

问题分析

显然该题是一个逻辑推断问题。张三、李四和王五3个人都可能说真话,也都可能说假话,那么如何来判断他们到底谁在说谎呢?

由问题描述可得到如下3个结论:

由于“张三说李四在说谎”,因此,如果张三说的是真话,则李四就在说谎;反之,如果张三在说谎,则李四说的就是真话。

由于“李四说王五在说谎”,因此,如果李四说的是真话,则王五就在说谎;反之,如果李四在说谎,则王五说的就是真话。

由于“王五说张三和李四两人都在说谎”,因此,如果王五说的是真话,则张三和李四两人都在说谎;反之,如果王五在说谎,则张三和李四两人至少一人说的是真话。

算法设计

该问题同样可用穷举法进行解决。

首先将问题分析中得到的3个分析结果用表达式表达出来。用变量x、y和z分别表示张三、李四和王五3人说话真假的情况,当x、y或z的值为1时表示该人说的是真话,值为0时表示该人说的是假话。则问题分析中的3个结论可以使用如下的表达式进行表示:

x==1 && y==0  表示张三说的是真话,李四在说谎;

x==0 && y==1  表示张三在说谎,李四说的是真话;

y==1 && z==0  表示李四说的是真话,王五在说谎;

y==0 && z==1  表示李四在说谎,王五说的是真话;

z==1 && x==0 && y==0  表示王五说的是真话,则张三和李四两人都在说谎;

z==0 && (x+y)!=0  表示王五在说谎,则张三和李四两人至少一人说的是真话。

在C语言中,可以使用一个逻辑表达式来表达出一个复杂的关系。将上面的表达式进行整理获得C语言的表达式如下:

(x&&!y || !x&&y) && (y&&!z || !y&&z) && (z&&x+y==0 || !z&&x+y!=0)

下面是完整的代码:

#include

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;

}

运行结果:

张三说的是假话.

李四说的是真话.

王五说的是假话.

6836c1309568e2fd711b0f7353ddec2c.png

0b1331709591d260c1c78e86d0c51c18.png

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值