求解逻辑题谁在说谎?

在矿山网吧休闲时,突然VC++群里有人问起:

编程求解谁在说谎。张三说:"李四说谎。"
李四说:"王五说谎。"
王五说:"张三和李四都在说谎。"
请问:这三个人中谁说的话是真话。

这题还比较有意思,脑子转动慢的我思考了大半天,得到了一些解决思路:

我们假设张三、李四和王五说话的真假分别由a、b、c来表示,1表示真,0表示假

则三个命题即可表示出来:

1)张三说:“李四说谎”,即可看做 张三是真则李四说谎或张三说谎李四说真即:   (a&&!b)||(!a&&b);

2)   李四说:“王五说谎” ->   (b&&!c)||(!b&&c);

3)   王五说: "张三和李四都在说谎"  -> 王五说真话则张三和李四都在说谎 或 王五说假话则张三李四至少一个说真话即       (c&&(a+b==0))||(!c&&(a+b!=0));

三者之间为 and 关系则我们综合三个表达式即得到:((a&&!b)||(!a&&b))&&((b&&!c)||(!b&&c))&&((c&&(a+b==0))||(!c&&(a+b!=0)))

我们遍历 a、b、c的取值情况进行验证,满足整个表达式为真的取值即为实际情况。

接下来进行编程实现就容易了,然而当时在网吧,也没有vc++编程环境,于是想到用javascript实现。

另外需要注意的是当使用java 或 C#实现时能麻烦一些,我们需要做一些改动。因为这两个语言不支持 if(1){...}语句,必须为if(true){...},同时bool型变量也不能做加减法运算,这里不做详细讨论了。

我们看看javascript的实现:顺便提一下javascript是寄生于客户端浏览器脚本程序,我们只要新建一个记事本保存下边代码,然后将其后缀名改为htm,双击打开,容许禁止的内容即可看到运行结果a:0  b:1  c:0 则说明b说的是真话

<html>

<body>
<script language=javascript>
var a,b,c;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
{

   if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0))
   {
        document.write("a:"+a);
        document.write("<br>b:"+b);
        document.write("<br>c:"+c);
   }
}
</script>
</body>

</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值