题目: a说:“我不是小偷。”b说:“c是小偷。”c说:“小偷肯定是d。”d说:“c冤枉人!”四人中有三人说的是真话,问到底谁是小偷。 #include <stdio.h>#define N_PEOPLE 4 //定义人的个数#define NUM_OF_TRUTH 3 //说真话人的个数int main(){ int hypothesis[N_PEOPLE]; //定义数组来描述假设,1表示真话,0表示假话 int num_of_true[N_PEOPLE]={0,0,0,0}; int i,j; int judge(int index,int hypothesis[]); //假设其中一个人是小偷,比如A是小偷,看几个人的描述跟这个假设吻合 //如果有三个描述和假设吻合,则假设成立,这个人就是小偷 //下面的循环从假设A是小偷开始一直到D,计算和假设吻合的描述个数 for(i=0;i<N_PEOPLE;i++) { //被假设成小偷的人被赋值成1,假设不是小偷的赋值成0 for(j=0;j<N_PEOPLE;j++) if(j==i) hypothesis[j]=1; else hypothesis[j]=0; //根据假设,求得符合假设的描述的个数 for(j=0;j<N_PEOPLE;j++) num_of_true[i]+=judge(j,hypothesis); } for(i=0;i<N_PEOPLE;i++) printf("如果%c是小偷,则说真话的人的个数是%d。\n",65+i,num_of_true[i]); printf("结论:\n"); for(i=0;i<N_PEOPLE;i++) if(num_of_true[i]==NUM_OF_TRUTH) printf("由题目所示,3人说了真话,所以,%c是小偷。\n",65+i); getchar(); return 0;}//这个函数来判断某一个人的描述是否和假设吻合,//如果吻合返回1,否则返回0//所有的描述被翻译成了代码//比如A是小偷则hypothesis[0]=1,//A不是小偷则hypothesis[0]=0//以此类推翻译所有4个人的描述为代码int judge(int index,int hypothesis[]){ int true_or_false; switch(index) { case 0: true_or_false=(hypothesis[0]==0); break; case 1: true_or_false=(hypothesis[2]==1); break; case 2: true_or_false=(hypothesis[3]==1); break; case 3: true_or_false=(hypothesis[3]==0); break; } return true_or_false;}输出结果如下:如果A是小偷,则说真话的人的个数是1。如果B是小偷,则说真话的人的个数是2。如果C是小偷,则说真话的人的个数是3。如果D是小偷,则说真话的人的个数是2。结论:由题目所示,3人说了真话,所以,C是小偷。

评论