问题描述: 一位教授逻辑学的教授有三名非常善于推理且精于心算的学生A,B和C。有一天,教授给他们三人出了一道题:教授在每个人脑门上贴了一张纸条并告诉他们,每个人的纸条上都写了一个正整数,且某两个数的和等于第三个.每个学生都能看见贴在另外两个同学头上的整数,但却看不见自已的数。这时,教授先对学生A发问了:“你能猜出自已的数吗?”A回答:“不能。”教授又转身问学生B:“你能猜出你自已的数吗?”B想了想,也回答:“不能。”教授再问学生C同样的问题,C思考了片刻后,摇了摇头:“不能。”接着,教授又重新问A同样的问题,再问B和C,。经过若干轮的提问之后,当教授再问某人时,此人突然露出得意的笑容,把贴在自已头上的那个数准确无误的报了出来。 现在告诉你,教授在第N次提问时,轮到回答问题的那个人猜出了贴在自已头上的数M,你能推断出另外两个学生的头上的贴的是什么数吗? 提示:总是头上贴着最大的那个数的人最先猜出自已头上的数。/********************************************************************** 文件名: recursion.h* 文件描述: 经典的递归题* 创建人: Angel (QQ:317725224)* 版本号: 1.0* 修改记录:*********************************************************************/ #include <iostream.h> const int Max=3; void Init(int a[], int n){ for(int i=1; i<n; i++) a[i]=i+1; a[i]=1;} int count(int a[], int start, int end){ int c=0; for(int i=start; a[i]!=a[end]; i=a[i]) c++; return c;} int times(int a[], int i, int j, int t1, int t2, int t3){ if(i<j) return times(a,i,j-i,t1,t3,t2)+count(a,t2,t3); else if(i>j) return times(a,i-j,j,t3,t2,t1)+count(a,t1,t3); else return t3;} void answer(int a[], int M, int N){ int k=1; int t[Max+1]; int i; for(i=1; i<=Max; i++) t[i]=i; if(N%Max!=0) { int temp=t[N%Max]; t[N%Max]=t[3]; t[3]=temp; } for(i=1; i<M; i++) { if(times(a,i,M-i,t[1],t[2],t[3]) == N) { cout<<i<<" "<<M-i<<endl; k=0; cout<<endl; } } if(k) cout<<"该条件无解!"<<endl;} void main(){ int a[Max+1]; Init(a,3); int M,N; cout<<"请输入提问次数:"; cin>>N; cout<<"请输入最大数:"; cin>>M; answer(a,M,N);}

评论