C学习示例100之三

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

#include <stdio.h>

// 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
// 分析:设这个数为i, x+100 = n², x+268 = m², m²-n² = 168
// (m+n)(m-n)=168, 设m+n=s,m-n=d ,s和d的取值范围为1-168之间
int main(void)
{
    int m, n, s, d, x;
    for (int s = 1; s < 168; s++)
    {
        if (168 % s == 0)
        {
            d = 168 / s;
            if (s > d && (s + d) % 2 == 0 && (s - d) % 2 == 0)
            {
                m = (s + d) / 2;
                n = (s - d) / 2;
                printf("%d\n", n * n - 100);
            }
        }
    }
    return 0;
}

本题的难度主要在于分析,具体如下:

设这个整数为x,得:式1:x + 100 = n²,式2:x + 268 = m²。

式2 – 式1 = m² – n² = 168.

再得(m + n)(m – n) =168.

设m+n = s, m – n = d;

所以:m+n+m-n = s + d, 2m = s + d, m = (s + d) / 2

同理:m + n – m + n = s – d, 2n = s – d, n = (s – d) / 2

因此,m和n都是偶数。

s 和 d的取值范围在1至168之间,排队重复的情况,s或d的取值仅为1 – 168/2 – 1 之间。

且,因为168是偶数,所以s和d至少要有一个数是偶数。

最终得到s和d都必须是偶数。

以上推导才是本题的难点。

检测一个数是否是偶数,n % 2 == 0;

发表评论