一、题目
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
二、分析
思路:根据题目,可列出方程
x + 100 = n^2
x + 100 + 168 = m^2
两个方程,却有3个未知数,在代数中,它可能是不可解的。但计算机的思维是不需要确切的知道某些值,可以通过无限枚举的方式。把你可能的值都列出来,通过限制条件,就可求出这个值。
由题可知:n^2 - 100 = m ^2 - 268 由此推出—> m ^2 - n ^2 = 168,展开完全平方为
(m + n) * (m - n) = 168,假设 (m + n) = i,(m - n) = j,则 i * j = 168,推出i和j不可能是两个奇数,因为奇数相乘不可能得到168,可能是一个偶数,一个奇数,或者两个都为偶数。
再由, (m + n) = i,(m - n) = j 知,,m = (i + j)/2,n = (i - j)/2,推出i和j一定是大于等于2的偶数,如果有一个为奇数,则 (i + j)/2或 (i - j)/2得不到整数m或n。
因为当i = 2时,j最大是168/2,则可确定 2 =< i * j <= 168/2,则可利用for循环,枚举出i和j的值,即可找出m和n的关系,即可算出x。
三、代码分析
int main(void)
{
int x,m,n,i,j;
for (i = 2;i < 168/2;i++)
{
if (168 % i == 0)
{
j = 168 / i;
m = (i + j) / 2;
n = (i - j) / 2;
x = (n * n) - 100;
printf("%d + 100 = %d * %d\n",x,n,n);
printf("%d + 268 = %d * %d\n",x,m,m);
}
}
return 0;
}
四、总结
这个题目是数学和编程逻辑思维的结合,关键是如何把数学的分析方法变成代码的逻辑。