说谎问题
有甲、乙、丙三人,每人或者说真话,或者说假话。
甲说:“乙说假话。”
乙说:“甲和丙是同一种人。”
问甲、乙、丙三人谁说真话,谁说假话?
分析:
① 本题看似漫无边际,无法入手,不知道怎么与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
请思考:如果题目中加入“丙说:‘甲说假话。’”,则程序如何编写?运行结果又是什么?
甲说:“乙说假话。”
乙说:“甲和丙是同一种人。”
问甲、乙、丙三人谁说真话,谁说假话?
分析:
① 本题看似漫无边际,无法入手,不知道怎么与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
请思考:如果题目中加入“丙说:‘甲说假话。’”,则程序如何编写?运行结果又是什么?