问题:A、B、C三个人中有人说了谎话。A:“B说的是谎话。” B:“C说的是谎话。” C:“A和B说的都是谎话。” 问:谁说了谎话。
人们用逻辑解决这个问题的方法也是假设某一个人说的是谎话,然后看根据题目能不能最后与这个假设矛盾。这也就是迭代法的一种。我们用C语言来代替人脑解决这个问题:
Step 1:将题目翻译为逻辑符号。
A: 经过思考易知,A为假时B为真,A为真时B为假。因此,A和B不可能同时为真。即 (a||b)==1且(a&&b==0)
B: 与A同理,(b||c)==1且(c&&b==0)
C: 当C为真时,C==1 && A||B==0 当C为假时,C==0 && A||B==1
Step 2:代码实现:
#include <stdio.h>
int a,b,c;
int main(void)
{
for(a=0;a<2;a++){
for(b=0;b<2;b++){
for(c=0;c<2;c++)
{
if(
((a||b) && !(a&&b)) &&
((b||c) && !(c&&b)) &&
( c && !(a||b) || ( !c&& (a||b))))
//(a&&b)==0可以替换为!(a&&b)
{printf("a==%d\n",a);printf("b==%d\n",b);printf("c==%d\n",c);
}
}
}
}
return 0;
}
结果:
a==0
b==1
c==0