您当前的位置:首页 > 计算机 > 编程开发 > C语言

说谎问题

时间:01-03来源:作者:点击数:

有甲、乙、丙三人,每人或者说真话,或者说假话。
         甲说:“乙说假话。”
         乙说:“甲和丙是同一种人。”

问甲、乙、丙三人谁说真话,谁说假话?

分析:
         ① 本题看似漫无边际,无法入手,不知道怎么与C语言程序设计挂钩。但只要和“真”、“假”、逻辑表达式联系起来,脉络就清晰起来。

         ② 这里用整型变量a、b、c表示甲、乙、丙三人说话的真假,当变量值为1时表示此人说真话,变量值为0时表示此人说假话。

甲说:“乙说假话。”这有两种可能:甲说的是真话,而乙确实说假话,即:
         a==1&&b==0 等价于a&&!b

或者甲说的是假话,而乙说真话,即:
         a==0&&b==1 等价于!a&&b

由此可得逻辑表达式:
         a&&!b||!a&&b

乙说:“甲和丙是同一种人。”这有两种可能:乙说真话,而甲和丙确是同一种人,即:
         b==1&&a==c 等价于b&&a==c

或者乙说的是假话,而甲和丙不是同一种人,即:
         b==0&& a!=c 等价于!b&& a!=c

由此可得逻辑表达式:
         b&&a==c||!b&& a!=c

上述两个逻辑表达式是“与”的关系(因为该满足的条件都要满足,所以是“与”的关系),最终得到确定谁说真话的逻辑表达式
        (a&&!b||!a&&b)&&( b&&a==c||!b&& a!=c) 

       ③ 穷举每个人说真话或说假话的各种情况,用上述表达式测试,使上述表达式的值为1(真)的情况就是正确的结果。

程序如下:

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&&a==c||!b&& a!=c)) 
 printf("a=%d,b=%d,c=%d\n",a,b,c); 
 } 
}

运行结果为:
         a=0,b=1,c=0
         a=1,b=0,c=0         

请思考:如果题目中加入“丙说:‘甲说假话。’”,则程序如何编写?运行结果又是什么?

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门