用C语言解决一道推理题(真正有本事的人进来),写出它的思路、算法和源程序

来源:百度知道 编辑:UC知道 时间:2024/05/17 03:17:11
有两个数a和b 已知a,b>1并a<b M知道a*b的值 S知道a+b的值
下面是两人的对话:
M:我不知道a和b的值
S:我也不知道a和b的值,但我先前不知道你不知道
M:我现在知道了
S:我也知道了
已知M和S足够聪明并没有撒谎
对于给定的x,y 2<=x,y<=550
且x<=a<b<=y
求出所有满足对话的a,b的值

其实这题并不算太难,关键就是M和S说的那4句话.理解那4句话,后面就好做多了.首先看"有两个数a和b 已知a,b>1并a<b M知道a*b的值 S知道a b的值"和"对于给定的x,y 2<=x,y<=550 且x<=a<b<=y "这两段话很容易理解,主要看x<=a<b<=y这个公式,这个公式其实就是告诉你a和b的取值范围由于,a要小于b所以就可以确定a的取值范围是2~549,b的取值范围是3~550.因为a永远要小于b,所以a为最小值2的时候b为3,b为最大值的时候a为最大值减1就是549.确定了a和b的范围再来看那4句话.首先M:我不知道a和b的值意思就是我光看a和b的积没办法判断值然后S:我也不知道a和b的值,但我先前不知道你不知道这句话是关键!!S首先说:我也不知道a和b的值.就是说他光看和也推断不出值,后面又说:但我先前不知道你不知道.这句话可以这样理解.就是说如果我先前知道你不知道我就知道了.整句话也就是说在S一眼看不出来的情况下,必须M一眼也看不出来!!!接下来是代码:
#include <stdio.h>

void jisuan(int ,int);

void main()
{
unsigned int a=0;
unsigned int b=0;
unsigned int add=0;//a+b的和
unsigned int multiply=0;//a*b的积

for(a=2;a<550;a++)
{
for(b=3;b<551;b++)
{
if(a>=b)
continue;
add=a+b;
multiply=a*b;
jisuan(add,multiply);
}
}
printf("\n");
}

void jisuan(int a,int b)
{
int i=0;
int j=0