逻辑表达式——谁在撒谎

一、问题描述

三个嫌疑犯在法官面前各执一词,

甲说:“乙在撒谎。”

乙说:“丙在撒谎。”

丙说:“甲乙两个人都在撒谎。”

法官为难,甲乙丙三人到底谁在说谎,谁在说真话?

二、算法思想

三个人中每个人有两种可能,要么说真话,要么说假话,因此通过穷举法即可判断出最终的结果。

假设甲乙丙三个人所说的话用变量a、b、c表示,0代表说假话,1代表说真话。根据题意,列出如下的逻辑表达式:

  甲:(a&&!b) || (!a&&b)

  乙:(b&&!c) || (!b&&c)

  丙:(c&&a+b==0) || (!c&&a+b!=0)

具体的操作利用循环语句解决,设置多重循环依次穷举出三人说真话和假话的所有可能。再利用条件语句进行判断,其条件表达式为:

    ( (a&&!b) || (!a&&b) ) && ( (b&&!c) || (!b&&c) ) && ( (c&&a+b==0) || (!c&&a+b!=0) )

三、程序代码

#include <stdio.h>
int main(){
    int 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)) ){
                    printf("甲说的是%s。\n", a?"真话":"假话");
                    printf("乙说的是%s。\n", b?"真话":"假话");
                    printf("丙说的是%s。\n", c?"真话":"假话");
                }
            }
        }
    }

    return 0;
} 

补充:条件运算符的优先级低于关系运算符和算术运算符,但高于赋值运算符。因此max=(a>b)?a:b,可以去掉括号写为max=a>b?a:b。条件运算符的结合方向是从右至左。

四、运行结果

时间: 2024-10-14 04:19:02

逻辑表达式——谁在撒谎的相关文章

shell 逻辑运算符、逻辑表达式详解

逻辑符号 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 block 档案』 -c 侦测是否为一个『 character 档案』 -S 侦测是否为一个『 socket 标签档案』 -L 侦测是否为一个『 symbolic link 的档案』 -e 侦测『某个东西』是否存在! 2. 关于程序的逻辑卷标! -G 侦测是否由 GID 所执行的程序所拥有 -O 侦测是否由 UI

javascript逻辑表达式&quot;&amp;&amp;&quot;和&quot;||&quot;

学习逻辑表达式时,学到了一些自己以前不理解的点,记录下来. 运算符“&&” “&&”运算符可以从三个不同层次进行理解: 第一层:当操作数都是布尔值的时候,“&&”对两个值执行布尔与(AND)操作,只有第一个操作数和第二个操作数都是true的时候,它才返回true. 第二层:“&&”可以对真值和价值(false,null,undified,0,-0,NaN和"")进行布尔值与(AND)操作. 第三层:运算符首先计算左操作数的

极简逻辑表达式的设计和查询

在数据库开发中,对两个关系表进行连接查询,能够直接做“逻辑或”的查询,而对于逻辑与和逻辑非的查询,则稍复杂点,需要编写额外的代码来实现.在关系型数据库中,所谓的连接,实际上是集合的包含,只要包含一项,就满足连接条件,实现的逻辑或,这种设计,能够满足绝大多数的查询需求.有时,对于一条数据,可能需要通过多个逻辑表达式来定性,比如,判定一篇文章是否跟Microsoft Azure有关,通常简单的做法是从多个关键字的逻辑组合来定性:文章中同时含有关键字“Microsoft”和“Azure”,或者同时含有

Linux Shell编程(4): 逻辑运算符、逻辑表达式详解

shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 block 档案』 -c 侦测是否为一个『 character 档案』 -S 侦测是否为一个『 socket 标签档案』 -L 侦测是否为一个『 symbolic link 的档

T-SQL 基于列的逻辑表达式 (CASE)

CASE简介 基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用. CASE表达式的作用与编程语言中的IF…THEN…ELSE逻辑类似.只是CASE表达式在T-SQL中并不能控制T-SQL程序的流程,只是作为基于列的逻辑使用. 一个简单的示例,假设有这样一张表: 在查询的时候,对于列S

Linux Shell 逻辑运算符、逻辑表达式详解

shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否为一个『 block 档案』 -c 侦测是否为一个『 character 档案』 -S 侦测是否为一个『 socket 标签档案』 -L 侦测是否为一个『 symbolic link 的档

9、C#里面的关系表达式、逻辑表达式

在C#语言的编程中,经常会用到关系表达式和逻辑表达式,或者二者的混合运用. 1.关系表达式是由关系运算符组成的.比如:>.<.>=.<=.==.!=.运用这几个运算符构成的表达式就叫做关系表达式.举例如下: int number_01; int number_02; //输入number_01的值 Console.Write("请输入number_01的值:"); number_01=Console.ReadLine(); //输入number_02的值 Con

创业公司撒谎的正确姿势是怎样的?

一亩田在周五(8月28日)晚大规模辞退销售员工,辞退理由是"严重违反了公司的规章制度".一亩田曾因"数据造假问题"闹得风生水起,关于创业公司撒谎造假的问题也再次进入人们的眼线.是不是撒谎的公司都是"不得好死"呢? 吹捧自己的产品团队,编造融资金额,夸大用户数量,吹嘘用户活跃度--创业公司撒谎的动机无非是为了尽快高估值融到更多资金.虽然站在创业公司的角度看这是无可厚非的,但大家好像对撒谎是深恶痛绝的. 因撒谎被揪出的典型一亩田.游侠电动车.云视链等

T_SQL基于列的逻辑表达式(case)

本文摘自:http://www.cnblogs.com/kissdodog/p/3154371.html(感谢作者的分享,总结的很好) 基于列的逻辑表达式,其实就是CASE表达式.可以用在SELECT,UPDATE,DELETE,SET以及IN,WHERE,ORDER BY和HAVING子句之后.由于这里讲的是T-SQL查询,所以只说到CASE表达式在SELECT子句和ORDER BY子句中的使用. CASE表达式的作用与编程语言中的IF…THEN…ELSE逻辑类似.只是CASE表达式在T-SQ