一个有趣的问题,(我只能给这么多了)(100分)

  • 主题发起人 主题发起人 flyhorse
  • 开始时间 开始时间
F

flyhorse

Unregistered / Unconfirmed
GUEST, unregistred user!
甲有两个不同的整数a、b,大于1小于50。
甲告诉乙a*b的值,乙说,我不知道这两个数是什么。
甲告诉丙a+b的值,丙说,我也不知道这两个数是什么,但是我知道乙肯定不知道这两个数是什么。
乙说,那我知道这两个数是什么了。
丙说,我也知道这两个数是什么了。
旁观者说,我们也知道这两个数是什么了。
问:这两个数是什么?
这是我在mud中看到一个有趣的问题,想了半天也没想出来,于是把他贴出来,给大家在闲着的看看,如果有谁能想出来,请把算法或程序给出来
 
此题五解
 
不是已经有答案了吗?这是我前天晚上思考的问题.
 
menxin:把答案给出来吧,顺便说说算法(我会给你加分的)
 
答案又不是我给的.我只是当晚参加了http://borforum.yeah.net/的讨论.我也只是
算出a*b是三个素数之积,a+b的范围在37个数之内.
 
据说答案是4,13,不知对不对,在http://borforum.yeah.net/有详细的解答,太长了.
 
是啊!这是著名的SP迷题,美国斯坦福大学教授John McCarthy (人工智能之父)
提出的一个模态逻辑趣题。所谓模态逻辑,Modal Logic,研究诸如‘知道‘这样
的一类模态词,非常有趣。
我这里有SP迷题的Pascal和Prolog程序,不过我当年可是没用计算机自己推理
出来的。
Nuke是信息学国奥队员,给大家介绍介绍算法吧?
 
真正的SP迷题的条件是2<=a,b<=99, 解是4,13
现在的条件不知道有没有解
 
发信人: daniel (小丹尼), 信区: AI
标 题: SP Puzzle (2)
发信站: 南大小百合信息交换站 (Mon Apr 27 20:43:55 1998), 转信
问题分析:
假设S=x+y, P=x*y
首先引入两个概念:
(1)若数c可以表示为数a和数b之和,即c=a+b,则称(a,b)为c的一个分拆。
(2)若数c可以表示为数a和数b之积,即c=a*b,则称(a,b)为c的一个分解。
有了这两个定义,S先生和P先生的对话就可以描述为:
Cond1: 对于S的任一分拆(u,v)都必然导致P的分解不唯一;
Cond2: 对于P的任一区别于(x,y)的分解(u,v)都不满足Cond1,即这些(u,v)
产生的S'=u+v将存在导致唯一分解之P,使由P的分解所产生的S"满足Cond1;
Cond3: 对于S的任一区别于(x,y)的分拆(u,v),都不满足Cond2,有且仅有
(x,y)满足Cond2。
同时满足Cond1,Cond2,Cond3的(x,y)就是解。
//hehe,不太容易理解,需要你浸进去想,还需要一点逻辑头脑
//仔细想想,还是很值得的,呵呵

--
*****************************************************************
归妹趋无妄,无妄趋同人,同人趋大有。甲转丙,丙转庚,庚转癸。
子丑之交,辰巳之交,午未之交。风雷是一变,山泽是一变,水火是一变。
乾坤相激,震兑相激,离巽相激。三增而成五,五增而成九。
*****************************************************************
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: aiake1.nju.edu.]
 
发信人: daniel (小丹尼), 信区: AI
标 题: SP Puzzle (3)
发信站: 南大小百合信息交换站 (Mon Apr 27 20:44:30 1998), 转信
通俗的解释:
下面这个解释远不如“问题分析”中的分析严密,而且逻辑也不是太完
善,但是也许要容易理解一点。
如果你知道哥德巴赫猜想,那么就要容易一些。哥德巴赫猜想是说:“任
意偶数必然可以分解成两个质数之和”。
显然,S先生拿着的是一个奇数,因为如果他拿着一个偶数的话,他无法
排除P先生拿着两个质数之积的可能(哥德巴赫猜想),这样P先生是可以知
道这两个数的,那么S先生就不能说出第一句话。
而P先生拿着的数应该有什么特性呢?
这个数应该只存在两种分解(这个“分解”是“问题分析”中的定义),
而且一种分解得到的两个数之和是偶数,另一种分解得到的两数之和是奇数!!
否则P先生凭什么能根据S先生的第一句话就得出结论呢?
//呵呵,下面我就不说了,你再仔细想想,是不是还能得到点线索?
//不过即使得出了所有线索,计算量仍然极大,这种活最适合用计算机做,呵呵
//如果你想清楚了,那么应该很容易就能看懂后面的Prolog程序,呵呵
//当然了,你要懂一点Prolog语言才行。
顺便说说答案,一个数是4,另一个是13。
//你想到没有?呵呵
--
*****************************************************************
归妹趋无妄,无妄趋同人,同人趋大有。甲转丙,丙转庚,庚转癸。
子丑之交,辰巳之交,午未之交。风雷是一变,山泽是一变,水火是一变。
乾坤相激,震兑相激,离巽相激。三增而成五,五增而成九。
*****************************************************************
 
发信人: daniel (小丹尼), 信区: AI
标 题: SP Puzzle (4)
发信站: 南大小百合信息交换站 (Mon Apr 27 20:44:58 1998), 转信
Turbo Prolog程序:
Predicates
puzzle(integer,integer,integer,integer)
boundd(integer,integer,integer)
unique(integer,integer,integer,integer)
find(integer,integer,integer)
cond1(integer,integer,integer,integer)
cond2(integer,integer,integer,integer)
cond3(integer,integer,integer,integer)
Goal
puzzle(2,99,X,Y),
write("The result is:"),nl,
write("X=",X),nl,
write("Y=",Y).
Clauses
puzzle(Lb,Hb,X,Y):- Hx=Hb/2, boundd(Lb,Hx,X),
boundd(X,Hb,Y), cond1(Lb,Hb,X,Y),
cond2(Lb,Hb,X,Y), cond3(Lb,Hb,X,Y).
boundd(L,H,_):- L>=H,!,fail.
boundd(L,_,L).
boundd(L,H,X):- L1=L+1, boundd(L1,H,X).
cond1(Lb,Hb,X,Y):- Z=X+Y, H=Z/2+1,
boundd(Lb,H,M1), N1=Z-M1,
unique(Lb,Hb,M1,N1),!,fail.
cond1(_,_,_,_).
unique(Lb,_,M,N):- P=M*N, find(Lb,P,U), not(U=M),
not(U=N), P mod U=0,!,fail.
unique(_,_,_,_).
find(Lb,Z1,_):- Q=Z1/Lb, Q<=Lb,!,fail.
find(Lb,_,Lb).
find(Lb,Z1,M2):- Lb1=Lb+1, find(Lb1,Z1,M2).
cond2(Lb,Hb,X,Y):- Z=X*Y,find(Lb,Z,M2), not(M2=X),
not(M2=Y), Z mod M2=0, N2=Z/M2,
N2<=Hb, cond1(Lb,Hb,M2,N2),!,fail.
cond2(_,_,_,_).
cond3(Lb,Hb,X,Y):- Z=X+Y, H=Z/2+1, boundd(Lb,H,M1),
not(M1=X), not(M1=Y), N1=Z-M1,
cond2(Lb,Hb,M1,N1),!,fail.
cond3(_,_,_,_).
--
*****************************************************************
归妹趋无妄,无妄趋同人,同人趋大有。甲转丙,丙转庚,庚转癸。
子丑之交,辰巳之交,午未之交。风雷是一变,山泽是一变,水火是一变。
乾坤相激,震兑相激,离巽相激。三增而成五,五增而成九。
*****************************************************************
 
发信人: grass (grass), 信区: AI
标 题: SP问题的Pascal实现
发信站: 南大小百合信息交换站 (Tue Apr 28 15:43:27 1998), 转信
题:已知自然数m.n,2≤ m,n≤ 99.S知道人两数之和,P知道两数之积,且知S
、P都诚实且聪明.?  
S对P说:“你不知道这两数是什么 ,我也不知道”。?  
P想了一会:“我知道了 ”。?  
S说:“我也知道了”。?  
试编程求两数.?  
    此题的关键是如何挖掘出每一句话的全部信息,例如第一句“你不知……
”,这句话表明这两数不能同为质数,也表明S得到数不可能分为两质数和等等,
考虑篇幅,这不做一 一分析,只把一些结论列出,有兴趣者可自己加以证明,不
明之处可与作者一齐探讨.  
(S得到的数记为X,乙得到的记为Y)  
1、两数不同系数。?  
2、X 不能分解为两数素和。?  
3、X不能分解为大于50的质数与任一数的和。?  
4、X为奇数,X-2为合数,(m.n 为一奇一偶)。?  
5、X+Y<=53(53为大于50的第一数素数)?  
以上均第一句话的信息,4.5由1.2.3得出,4.5能包名第一句话的所有信息。?  
6. Y分解为两数之积,只有一种情况能满足4.5?  
7. X分解为两数之和,只有一种情况能满足6?  
6为第二句话的含义,7为第三句话含义。?  
   
   下面附上源程序. GuessNum函数与4等价;5是在这过程中实现判断,6是由
CertiaNum函数实现, 7 由函数Lastok实现。程序在Turbo pascal 6.0 下运行
通过,环境为MS-DOS 6.22机型486 DX4/100兼容机 ?

运行结果?  
The anewer is 13   4? 
Turbo Pascal程序:
program dup1(input,output);
const MinZ=53;
var num1,num2:integer;

function GuessNum(num:integer):boolean;
var i:integer;
p:boolean;
begin

num:=num-2;
p:=true;i:=3;
while p and (i begin

if (num mod i)=0 then
p:=false;
i:=i+2;
end;

GuessNum:=not p
end;

function CertainNum(mul,num1:integer):boolean;
var a,b:integer;
p:boolean;
begin

a:=1;p:=true;
while(a<=mul div 2-1) and pdo

begin

a:=a+2;
if (mul mod a)=0 then

begin

b:=mul div a;
if (GuessNum(a+b)) and (b in [2..99])
and(a in [2..99]) and (a<>num1) then

p:=false;
end;

end;

CertainNum:=p;
end;

function LastOk(num:integer):boolean;
var k:integer;
p:boolean;
begin

k:=2;p:=true;
while p and (k<=(num-2))do

begin

if (k<>num2) and CertainNum(k*(num1+num2-k),
(num1+num2-k)) then
p:=false;
end;

LastOk:=p;
end;

{===================main program============}
begin

writeln;num1:=3;
repeat
num2:=2;
repeat
if GuessNum(num1+num2) and CertainNum(num1*num2,num1)
and LastOk(num1+num2) then

writeln('The Answer is :',num1:10,num2:5);

num2:=num2+2;
until num2+num1>MinZ;
num1:=num1+2;
until num1>MinZ;
end.

--
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: 202.119.36.74]
 
To pega: 你从哪里翻出来的这些, 我在NU从
没找到BBS之类的地方.
 
注:
sp(2,99)结果为4,13
sp(1, 50)结果为1,6
sp(2, 50)结果为4,13
其实计算量不是很大,手工完全可以很快求出
grass的程序可以按照簿记中间结果的方法大大地提高计算速度
To SeaSky:
hehe, 当年我在小百合上面当数学版的副版主,这就是当年讨论的
 
当年 7.5 (--.--) 的时候小百合偷偷地对校内开放,结果被勒令关闭了。
现在又重新开放了,我哪天再上去看看。不过工作以后没有那么多时间啦。。。
 
接受答案了.
 
后退
顶部