分析:
完全平方数的定义:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。所以完全平方数不是负数,但题目所求数却可能是负数,下面讨论这种情况。
先用数学分析:
- 令该数为x
- 依题意有:x+100=n*n ; x+100+168=m*m
- 则:m^2-n^2=168=(m+n)(m-n) //分解因式
- 令:m+n=i ; m-n=j
- 即:i*j=168 //因为168 是一个偶数,所以i和j至少一个是偶数
- 由{ m+n=i ; m-n=j }
- 可得 { m=(i+j)/2 ; n=(i-j)/2 }
- 因为 { 2m=(i+j) ; 2n=(i-j) }可知 i 和 j 的合或差是偶数,所以 i 和 j 奇偶性相同
//奇数和偶数的一些性质 :奇偶性相同的两个数的和或差为偶数;反之也成立,即:两个整数的和
//或 差为偶数,这两个数奇偶性相同
- 即:i 和 j 要么都是偶数,要么都是奇数
- 因为i*j=168 ,i和j至少一个是偶数,所以i和j都是偶数
- 由于 i * j = 168, j>=2,这里取 i>j
//解释一下i>j的意思:例如48=i*j=1*48=2*24=3*16=4*12=6*8=8*6=12*4=16*3=24*2=48*1,
//由此可见i和j在6*8处其实是交换(i*j=j*i)了,也就是说,只需找出i>j条件下值即可
- 则 1 < i < 168 / 2 + 1
- 接下来将 i 的所有数字依次带入循环计算即可
代码实现:
#include<stdio.h>
int main(void)
{
int i, j, m, n, x;
for (i = 1; i <= 168 / 2 + 1; i++)
{
if (168 % i == 0) //排除i中的奇数
{
j = 168 / i;
if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)
{
m = (i + j) / 2;
n = (i - j) / 2;
x = n * n - 100;
printf("%d + 100 = %d * %d\n", x, n, n);
printf("%d + 100 + 168 = %d * %d\n", x, m, m);
}
}
}
return 0;
}
运行结果:
-99 + 100 = 1 * 1
-99 + 100 + 168 = 13 * 13
21 + 100 = 11 * 11
21 + 100 + 168 = 17 * 17
261 + 100 = 19 * 19
261 + 100 + 168 = 23 * 23
1581 + 100 = 41 * 41
1581 + 100 + 168 = 43 * 43D:\program\usual\vs\cdy\Debug\cdy.exe (进程 16380)已退出,代码为 0。
按任意键关闭此窗口.
其中,当数为负数-99时,也满足题目要求。