1<a<b<100
把a+b的值告诉甲
把axb的值告诉乙
问a,b分别是什么
甲对乙说:“我不知道,但你也不知道。”
过了会,乙说:“我知道答案了。”
又过了会,甲说:“我也知道答案了。”
问你a,b是几。
把a+b的值告诉甲
把axb的值告诉乙
问a,b分别是什么
甲对乙说:“我不知道,但你也不知道。”
过了会,乙说:“我知道答案了。”
又过了会,甲说:“我也知道答案了。”
问你a,b是几。
解决方案 »
- 多了一个星星按惯例散分
- 英巴卡迪诺公司(Delphi现在的所有者)北京办事处发来的法务公函
- 路过不能错过,快来拣分~~~服务器/客户端程序开发问题
- 关于用odac连接oracle数据库的问题,为什么提示oci.dll找不到指定模块?(在线)
- 如何获得注册表指定项中的所有键值和信息
- 请问那位高手有使用SOCKET传输文件的实例(源代码),或相关书籍下载?
- 请教:自定义查询
- 各位大侠帮我看一下写文本文件的错误!!(在线等!)
- 怎样使用MessageBox函数??
- 在将checkbox加入treelist控件中时,怎样更改checkbox的图标
- 如何用query执行多条sql语句。
- ExpressQuantumGrid 的问题求救!!!
甲就是a, 乙就是b
首先,我觉得这两个数肯定不可能都是质数,因为只有甲看到自己的和数不能分解成两个质数时才能断定乙不知道.
当乙听到甲说的话以后,便知道了答案,由此推断,乙手上的数积只能分解成两种情况,一种是分解后两数和可以分成两质数和,第二种情况是分解后的两数和不能分解成质数和,排除甲说的话,所以他断定自己属于第二种,所以能说出答案。
另外,如果一个数积只能分解成两种情况,那么他的形成只能是x*x*y,其中xy均为质数,则a,b可能的值为x*x,y或x,x*y,而根据已知条件,x,x*y形式中,x,y均不可能>49.
然后我想根据以上情况,我可以用循环解决问题,现在正在尝试.........
俺也不知道是否复杂,俺心里是这样想的,这个问题我从bbs上看来的,没有人答对,所以弄过来跟大家讨论讨论,纯属讨论,不是俺小气,只想让大家动动脑筋。To:journay(梦回唐朝)
不对吧,如果是3,4那么,和为7,和为7的话,可以是2+5,如果对方手里的积是10的话,直接就可以判定了,所以甲无法确认乙不知道
首先,本程序用到了一个stringgird控件,用来存放结是否是质数果。程序如下:
function isprime(x:integer):boolean;//判断一个数
var
i:integer;
begin
isprime:=true;
for i:=2 to (x div 2) do
if (x mod i)=0 then isprime:=false;
end;function cansplit(x:integer):boolean; 判定一个数是否可分割成两个质数的和。
var
i:integer;
begin
cansplit:=false;
for i:=2 to (x div 2) do
if isprime(i) and isprime(x-i) then
cansplit:=true;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
x,y,i:integer;
begin
stringgrid1.RowCount:=2;//stringgrid共4列,存放a,b,a+b,a*b
i:=1;
//判定a,b为x*x,y的形式情况下,符合条件的数对。
for x:=2 to 9 do
for y:=2 to 99 do
if isprime(x) and isprime(y) then
if not cansplit(x*x+y) then
begin
stringgrid1.Cells[0,i]:=inttostr(x*x);
stringgrid1.Cells[1,i]:=inttostr(y);
stringgrid1.Cells[2,i]:=inttostr(x*x*y);
stringgrid1.Cells[3,i]:=inttostr(x*x+y);
i:=i+1;
end;
//判定a,b为x*y,x的情况下符合条件的数对。
for x:=2 to 49 do
for y:=2 to 49 do
if isprime(x) and isprime(y) then
if not cansplit(x*y+x) then
begin
stringgrid1.Cells[0,i]:=inttostr(x);
stringgrid1.Cells[1,i]:=inttostr(x*y);
stringgrid1.Cells[2,i]:=inttostr(x*x*y);
stringgrid1.Cells[3,i]:=inttostr(x*y+x);
i:=i+1;
end;
stringgrid1.RowCount:=i;//删除和或积重复的行
for x:=1 to i do
for y:=x+1 to i do
if stringgrid1.cells[2,x]=stringgrid1.cells[2,y] then
begin
stringgrid1.Rows[x].clear;
stringgrid1.Rows[y].clear;
end;for x:=1 to i do
for y:=x+1 to i do
if stringgrid1.cells[3,x]=stringgrid1.cells[3,y] then
begin
stringgrid1.Rows[x].clear;
stringgrid1.Rows[y].clear;
end;
//剩下的在表格中未被清除的列就是符合条件的。
//嘿嘿,不好意思,删除行用的办法太苯了,有没有更好的。
end;
以上仅供参考,欢迎讨论。