真话看成1,假话看成0,那么ABC可以看成3位二进制数,所有情况就是二进制数自增。
考虑扩展,自增函数我写的任意位数二进制通用。如果想添加D、E、F。。。改一下规则函数isTrue就行。
按照本题,规则A*B==0 && B*C==0 && A==B。
#include
#include
#include
char *add_abc(char *abc);// 二进制加1
int isTure(char *abc);//判断假设是否成立,成立返回1,不成立返回0
int main()
{
char *abc=NULL;
abc=(char *)malloc(sizeof(char)*4);
strcpy(abc,"000");
while(1)
{
printf("假设A说%s,B说%s,C说%s,假设%s\n",abc[0]-'0'?"真话":"假话",abc[1]-'0'?"真话":"假话",abc[2]-'0'?"真话":"假话",isTure(abc)?"成立":"不成立");
abc=add_abc(abc);
if(!strcmp(abc,"000"))
break;
}
return 0;
}
int isTrue(char *abc)//判断假设是否成立,成立返回1,不成立返回0
{
int a=abc[0]-'0',b=abc[1]-'0',c=abc[2]-'0';
if(a*b==0 && b*c==0 && a==b)
return 1;
return 0;
}
char *add_abc(char *abc)// 二进制加1
{
int i,n=strlen(abc),jin=0;
for(i=n-1;i>=0;i--)
if(i==n-1)
if(abc[i]=='0')
abc[i]='1';
else
{
abc[i]='0';
jin=1;
}
else
if(abc[i]-'0'+jin<2)
{
abc[i]=abc[i]-'0'+jin+'0';
jin=0;
}
else
{
abc[i]='0';
jin=1;
}
return abc;
}
a第一个提出可以排除,而b被提出后并没有反过来说a,而是说了c,c不知情,就说了两人。所以,b在说谎
①如果A说谎,
B则没说谎,
那么C则也在说谎。
😎😎😎😎😎😎😎😎
②如果A没说谎,
那么B说谎了,
则B说C说谎不成立,
即C说实话了,
这与C说A和B在说谎矛盾!
😎😎😎😎😎😎😎😎😎😎
用A表示A说谎,~A表示A没有说谎,
~A→B,
~B→C,
~C→A&B。
A→B
B→C
C→A·B
B 说谎