一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A B C。有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他们,每个人都纸条上都写了一个正整数,且某两个数的和等于第三个。于是,每个学生都能看见贴在另外两个同学头上的证书,但却看不见自己的数
这时,教授对学生A发问了:你能猜出自己的数吗?A:不能;教授转身问B:你能猜出自己的数吗?B想了想:不能;教授再问C:你能猜出自己的数吗?C想了想:不能。教授又开始重复问A B C,经过若干轮的提问之后,当教授再次询问某人时,此人露出得意的笑容,准确的报出了自己的数。
已知教授共提问了N次,最先猜出自己头上数的人头上贴着的整数为M,求另外两个整数。(总是头上贴着最大的那个数的人最先猜出)
思路:因为总是头上贴着最大的那个数的人最先猜出,而他能猜出自己头上的数,必定是在否定了其他两个数的差。
#include
#define N 5
#define M 8
int getTimes(int i,int j,int t1,int t2,int t3);
int getP(int x,int y);
main()
{
int i;
int temp;
int t1,t2,t3;
temp = M >> 1;
if(N%3 == 1){
t1 = 2;
t2 = 3;
t3 = 1;
}
else{
if(N%3 == 2){
t1 = 1;
t2 = 3;
t3 = 2;
}
else{
t1 = 1;
t2 = 2;
t3 = 3;
}
}
for(i=1;i j){
return getTimes(j,i-j,t2,t3,t1) + getP(t1,t3);
}
else{
return getTimes(i,j-i,t1,t3,t2) + getP(t2,t3);
}
}
}
int getP(int x,int y)
{
if(x < y){
return y - x;
}
else{
return y + 3 - x;
}
}