供参考:
#include <math.h>
#include <stdio.h>
int main()
{
long int i, x, y;
for (i = 1; i < 100000; i++)
{
x = sqrt(i + 100); //x为加上100后开方后的结果
y = sqrt(i + 268); //y为再加上168后开方后的结果
if (x * x == i + 100 && y * y == i + 268)
//如果一个数的平方根的平方等于该数,这说明此数是完全平方数
printf("%ld\n", i);
}
return 0;
}
设加100后的平方根为x,再加168后的平方根为y,设原数为z,可知y>x
有 yy - xx = (z +100+168)-(z+100)
得出
yy - xx = 168
即(y+x )(y-x)=168,又x+y>y -x>0
再根据168的因数特性和前面条件,可以很快搜索得出x,y ,从而得出z=1581,261,21,-99
当然楼上的直接搜索也是可以的,但边界条件的得出是没有根据的,比如它就没有得出-99这个答案。根据前面的一些信息,z+100>0,z +268<=168*168
#include <math.h>
#include <stdio.h>
int main()
{
long int i, x, y;
for (i =- 100; i <=168*168-268; i++)
{
x = sqrt(i + 100); //x为加上100后开方后的结果
y = sqrt(i + 268); //y为再加上168后开方后的结果
if (x * x == i + 100 && y * y == i + 268)
//如果一个数的平方根的平方等于该数,这说明此数是完全平方数
printf("%ld\n", i);
}
return 0;
}