本帖最后由 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;
} |