查看: 4803|回复: 4

[逻辑推理] 猜数字

转载  简洁模式
1
发表于 2010-7-27 12:43:07
老师从1到80之间(大于1小于80)选了两个自然数,将二者之积告诉同学P,二者之和告诉同学S,然后他问两位同学能否推出这两个自然数分别是。
S说:我知道P肯定不知道这两个数
P说:那么我知道了
S说:那么我也知道了!
其他同学:我们也知道了!
……
通过这些对话,你能猜到老师选出的这两个自然数是什么吗?
发表于 2010-7-27 12:56:16
本帖最后由 银翼 于 2010-7-27 12:58 编辑

算过类似的题目,过程比较繁琐,我就不一一列出来啦,直接答案好了
没计错应该是4和13
发表于 2010-7-27 13:42:14
这题还蛮难的。。主要是数字太多了。。可能性也太多了。。
个人感觉楼上的应该是正解。。
我觉得关键在于质数问题上。。但是我没有解决办法。。
发表于 2010-7-27 14:32:00
本帖最后由 freedream00 于 2010-7-27 14:35 编辑

楼主总是喜欢难为我们。
1。不能仅根据两数的和s来判断m、n,说明s分解为a+b的形式超过一种(s不能为5,也就是说:m、n不能是2、3)

2。不能仅根据两数的积p来判断m、n,说明p分解为a*b的形式超过也一种(p不能为素数,且p不能表示为两素数的积,也就是m、n不能同时为素数)(这一条同样可以得到,p不能为6,也就是m、n不能为2、3)

3。根据S所说的:“我知道你不知道这两个数是什么”,说明:
s分解为a+b的所有形式当中,均有a、b不能同时为素数(s不能表示为两素数的和,m、n为1奇1偶)

4。根据P所说的:“现在我知道这两个数了”,说明:
在知道p是多少的情况下,综合1、2、3的三个条件可以判别出m、n。
即有:p可唯一分解为   素数*2^k(k为大于1的自然数)的形式
(为什么有此结论?:
因为P为条件2下无法判别,但是在条件2、3下可判别,说明p可以分解   奇数*偶数,也可分解为偶数*偶数,获得条件3后,即可排除偶数*偶数的形式。
又因为此奇数*偶数的形式是唯一的,所以只能是   素数*2^k(k为大于1的自然数)的形式)

5。根据S所说的:“现在我也知道这两个数了”,说明:
在知道s是多少的情况下,综合1、2、3、4的四个条件也可以判别出m、n。
即有:s可唯一分解为   素数+2^k(k为大于1的自然数)的形式
(为什么这样?自己想想)


综合上述条件,4、13是符合题意的最小的解。




或用程序解
LPC语言(可解析成Pike语言)

这个程序是一个网友写的,   
用的是LPC语言。   
不过可解析成Pike语言,要翻译成C恐怕得费点工夫。   
我运行过是正常的。   
   
   
int   main(object   me)   
{   
                int   i,j;   
                mapping   he=([]),ji=([]),he2=([]),he3=([]);   
                string   temp_he,temp_ji,sub_temp_he;   
                string   *keys_ji,*keys_he,*keys_he3;   
                write( "begin...\n ");   
                for   (i=2;i <=99;i++)   
                                for(j=i;j <=99;j++)   
                                {   
                                                if   (undefinedp(he[temp_he=(i+j)+ " "]))   
                                                                he[temp_he]=({sprintf( "%02d%02d ",i,j)   });   
                                                else   
                                                                he[temp_he]+=({sprintf( "%02d%02d ",i,j)   });   
                                                if   (undefinedp(ji[temp_ji=(i*j)+ " "]))   
                                                                ji[temp_ji]=({sprintf( "%02d%02d ",i,j)   });   
                                                else   
                                                                ji[temp_ji]+=({sprintf( "%02d%02d ",i,j)   });   
                                }   
                keys_ji=keys(ji);   
                keys_he=keys(he);   
                //X对Y说:我不知道a,b是什么数   
                foreach(temp_he   in   keys_he)   
                                if   (sizeof(he[temp_he])==1)   
                                                map_delete(he,   temp_he);   
                //X肯定Y也不知道   
                foreach(temp_ji   in   keys_ji)   
                                if   (sizeof(ji[temp_ji])==1)   
                                {   
                                                sscanf(ji[temp_ji][0][0..1], "%d ",i);   
                                                sscanf(ji[temp_ji][0][2..3], "%d ",j);   
                                                if   (!undefinedp(he[(i+j)+ " "]))   
                                                                he2[(i+j)+ " "]=he[(i+j)+ " "];   
                                                //Y对X说:我开始确实不知道a,b是什么数   
                                                map_delete(ji,   temp_ji);   
                                }   
                foreach(temp_he   in   keys(he2))   
                                map_delete(he,   temp_he);   
                //Y对X说:我开始确实不知道a,b是什么数,但是听你这么说,我就知道这两个   
是什么数了。   
                keys_ji=keys(ji);   
                foreach(temp_he   in   keys(he2))   
                                foreach(sub_temp_he   in   he2[temp_he])   
                                {   
                                                sscanf(sub_temp_he[0..1], "%d ",i);   
                                                sscanf(sub_temp_he[2..3], "%d ",j);   
                                                if   (!undefinedp(ji[(i*j)+ " "]))   
                                                                ji[(i*j)+ " "]-=({sub_temp_he});   
                                }   
                keys_ji=keys(ji);   
                //找出Y的所以组合   
                foreach(temp_ji   in   keys_ji)   
                                if   (sizeof(ji[temp_ji])==1   )   
                                {   
                                                sscanf(ji[temp_ji][0][0..1], "%d ",i);   
                                                sscanf(ji[temp_ji][0][2..3], "%d ",j);   
                                                if   (undefinedp(he3[(i+j)+ " "]))   
                                                                he3[(i+j)+ " "]=ji[temp_ji];   
                                                else   
                                                                he3[(i+j)+ " "]+=ji[temp_ji];   
                                }   
                //然后X对Y说:呵呵,我也知道这两个是什么数了。   
                keys_he3=keys(he3);   
                foreach(temp_he   in   keys_he3)   
                                if   (sizeof(he3[temp_he])==1   &&   !undefinedp(he[temp_he])   &&   
sizeof(he[temp_he])> 1)   
                                {   
                                                sscanf(he3[temp_he][0][0..1], "%d ",i);   
                                                sscanf(he3[temp_he][0][2..3], "%d ",j);   
                                                write( "AABB= "+he3[temp_he][0]+ ";积= "+(i*j)+ ";和= "+t   
emp_he+ "\n ");   
                                }   
                return   1;   
}
发表于 2010-7-27 14:38:37
原题:一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓,把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。第二天,庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。随后,孙膑说:我知道了。庞涓说:我也知道了。请问:这两个数是什麽?

设欲求的两个数为(X,Y),庞涓知道的和数设为A,孙膑知道的乘积设为B。定义A的"鬼谷和拆分"为满足m+n=A的整数m、n,且2<= m<=n<=99;定义B的"鬼谷积拆分"为满足p*q=B的整数p、q,且2<=p<=q<=99。
一、 解读"庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。"
这说明通过A的所有"鬼谷和拆分"中两个数的乘积都不能知道(X,Y)。
先给出乘积在以下两种情况时就能通过乘积直接知道两个乘数。
结论1、C=D*E,D,E均为素数,这时通过乘积就能知道两个乘数肯定为D,E。
结论2、C=D*E,E为>=53的素数,因为C为2-99之间的两个数的乘积,而E为>=53的素数,所以这两个乘数之一肯定是E,另一个就为D。
下面从分析A的值入手,
(1) A不能为197(99+98),这是2-99之间最大的两个数,孙膑当然能通过B知道这两个数是98、99;
(2) 197>A >=99不能成立,如果A>=99,那么A的一个"鬼谷和拆分"为m+97=A,根据结论2,孙膑就能知道(X,Y)分别为97和B/97;
(3) 99>A >=55不能成立,如果99>A >=55,那么A的一个"鬼谷和拆分"为m+53=A,根据结论2,孙膑就能知道(X,Y)分别为53和B/53;
(4) A不能为<55的偶数,因为任一偶数都能拆成两个素数之和(这是哥德巴赫猜想的结论,虽然哥德巴赫猜想还没有被证明,但在<55的范围内可以一一试出来),根据结论1,孙膑就能知道(X,Y)就是这两个素数;
(5) A不能为5、7、9、13、19、21、25、31、33、39、43、45、49,因为这些数都能拆成2和另一素数之和,根据结论1,孙膑就能知道(X,Y)就是这两个素数
这样我们只需分别讨论A为11、17、23、27、29、35、37、41、47、51、53这11种情况,也就是说只有A为这11个数之一时,才能"庞涓很有自信的对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知道。"

二、 继续解读"随后,孙膑说:我知道了。"
(1) A=11时,它的"鬼谷和拆分"有(2,9)、(3,8)、(4,7)、(5,6),B只可能为18、24、28、30。
如果B=18,它的"鬼谷积拆分"有(2,9)、(3,6),根据庞涓说的第一句话,(X,Y)不可能是(3,6),孙膑就能知道(X,Y)是(2,9);
如果B=24,它的"鬼谷积拆分"有(2,12)、(3,8)、(4,6),根据庞涓说的第一句话,(X,Y)不可能是(2,12)和(4,6),孙膑就能知道(X,Y)是(3,8);
28和30不再讨论。
(2) A=17时,它的"鬼谷和拆分"有(2,15)、(3,14)、(4,13)、(5,12)、(6,11)、(7,10)、(8,9),B只可能为30、42、52、60、66、70、72。
如果B=30,它的"鬼谷积拆分"有(2,15)、(3,10)、(5,6),根据庞涓说的第一句话,(X,Y)不可能是3、10,但是孙膑不能知道(X,Y)是(2,15)还是(5,6);
如果B=42,它的"鬼谷积拆分"有(2,21)、(3,14)、(6,7),根据庞涓说的第一句话,(X,Y)不可能是(6,7),但是孙膑不能知道(X,Y)是(2,21)还是(3,14);
如果B=52,它的"鬼谷积拆分"有(2,26)、(4,13),根据庞涓说的第一句话,(X,Y)不可能是(2,26),孙膑就能知道(X,Y)是(4,13);
如果B=66,它的"鬼谷积拆分"有(2,33)、(3,22)、(6,11),根据庞涓说的第一句话,(X,Y)不可能是(3,22),但是孙膑不能知道(X,Y)是(2,33)还是(6,11);
如果B=70,它的"鬼谷积拆分"有(2,35)、(5,14)、(7,10),根据庞涓说的第一句话,(X,Y)不可能是(5,14),但是孙膑不能知道(X,Y)是(2,35)还是(7,10);
如果B=72,它的"鬼谷积拆分"有(2,36)、(3,24)、(4,18)、(6,12)、(8,9),根据庞涓说的第一句话,(X,Y)不可能是(2,36)、(4,18)、(6,12),但是孙膑不能知道(X,Y)是(3,24)还是(8,9)。
只有B=52时才能知道(X,Y)

(3) A=23时,它的"鬼谷和拆分"有(4,19)、(7,16)等,B可能为76、112等。
如果B=76,它的"鬼谷积拆分"有(2,38)、(4,19),根据庞涓说的第一句话,(X,Y)不可能是(2,38),孙膑就能知道(X,Y)是(4,19);
如果B=112,它的"鬼谷积拆分"有(2,56)、(4,28)、(7,16)、(8,14),根据庞涓说的第一句话,(X,Y)不可能是(2,56)、(4,28)、(8,14),孙膑就能知道(X,Y)是(7,16);
(4) 在A为27、29、35、37、41、47、51、53时,都至少有两个"鬼谷和拆分"使得孙膑根据B知道(X,Y),这里不再详细讨论,只列出孙膑能确定(X,Y)的A的两个"鬼谷和拆分"。
A=27时,B=50时能确定(X,Y)为(2,25),B=92时能确定(X,Y)为(4,23)。(2,25)、(4,23)是A的"鬼谷和拆分";
A=29时,B=54时能确定(X,Y)为(2,27),B=168时能确定(X,Y)为(8,21)。(2,27)、(8,21)是A的"鬼谷和拆分";
A=35时,B=96时能确定(X,Y)为(3,32),B=304时能确定(X,Y)为(16,19)。(3,32)、(16,19)是A的"鬼谷和拆分";
A=37时,B=232时能确定(X,Y)为(8,29),B=160时能确定(X,Y)为(5,32)。(8,29)、(5,32)是A的"鬼谷和拆分";
A=41时,B=128时能确定(X,Y)为(4,37),B=288时能确定(X,Y)为(9,32)。(4,37)、(9,32)是A的"鬼谷和拆分";
A=47时,B=172时能确定(X,Y)为(4,43),B=496时能确定(X,Y)为(16,31)。(4,43)、(16,31)是A的"鬼谷和拆分";
A=51时,B=188时能确定(X,Y)为(4,47),B=608时能确定(X,Y)为(19,32)。(4,47)、(19,32)是A的"鬼谷和拆分";
A=53时,B=592时能确定(X,Y)为(16,37),B=672时能确定(X,Y)为(21,32)。(16,37)、(21,32)是A的"鬼谷和拆分";


三、 再解读"庞涓说:我也知道了。"
通过上面二的分析,只有在A=17时,庞涓才能唯一确定(X,Y)是什么,即(X,Y)=(4,13)
尚未登录
您需要登录后才可以回帖 登录 | 加入学院