1<a<b<100
把a+b的值告诉甲
把axb的值告诉乙
问a,b分别是什么
甲对乙说:“我不知道,但你也不知道。”
过了会,乙说:“我知道答案了。”
又过了会,甲说:“我也知道答案了。”
问你a,b是几。

解决方案 »

  1.   

    白痴题(我想去Intel)  
    甲就是a,  乙就是b
      

  2.   

    我靠,这么难吗,告诉大家我的思路,或许有些帮助,不过我也还没作出来,刚才正要作程序,突然有人找,希望兄弟们努力呀!
    首先,我觉得这两个数肯定不可能都是质数,因为只有甲看到自己的和数不能分解成两个质数时才能断定乙不知道.
    当乙听到甲说的话以后,便知道了答案,由此推断,乙手上的数积只能分解成两种情况,一种是分解后两数和可以分成两质数和,第二种情况是分解后的两数和不能分解成质数和,排除甲说的话,所以他断定自己属于第二种,所以能说出答案。
    另外,如果一个数积只能分解成两种情况,那么他的形成只能是x*x*y,其中xy均为质数,则a,b可能的值为x*x,y或x,x*y,而根据已知条件,x,x*y形式中,x,y均不可能>49.
    然后我想根据以上情况,我可以用循环解决问题,现在正在尝试.........
      

  3.   

    To:DWGZ() ( ) 
    俺也不知道是否复杂,俺心里是这样想的,这个问题我从bbs上看来的,没有人答对,所以弄过来跟大家讨论讨论,纯属讨论,不是俺小气,只想让大家动动脑筋。To:journay(梦回唐朝) 
    不对吧,如果是3,4那么,和为7,和为7的话,可以是2+5,如果对方手里的积是10的话,直接就可以判定了,所以甲无法确认乙不知道
      

  4.   

    告诉大家一个好消息,经过俺一下午的努力,终于编程实现了,和同事们分析觉得没有错,现共享给大家,如有疑问,欢迎讨论。
    首先,本程序用到了一个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;
    以上仅供参考,欢迎讨论。