题目

找出 1000 以内的所有完全数并输出。完全数(Perfect number)是指一个正整数恰好等于除了它本身以外的所有真因子之和(例如 6 = 1 + 2 + 3)。

输入格式:无键盘输入。

输出格式:按升序输出 1000 以内的完全数,每个数字后跟空格,最后换行。

数据范围与约定:测试范围 [2, 1000]。

思路与算法

1. 真因子求和
对于每个数 n,初始化因数和 sum = 1(1 必然是所有大于 1 的数的真因子)。因子成对出现,遍历从 2 到 i * i ≤ n,若整除则累加 i 和 n/i(注意完全平方时不要重复加)。

2. 结果判定
遍历求和结束后,若 sum == n,则该数为完全数(如 6, 28, 496)。

完整程序

#include <stdio.h>

int main(void)
{
    // 完全数定义:等于除自身以外的所有真因子之和(如 6 = 1 + 2 + 3)
    for (int n = 1; n <= 1000; n++) {
        int sum = 0;
        // 遍历所有可能的真因子(最大不超过 n/2)
        for (int d = 1; d <= n / 2; d++) {
            if (n % d == 0) {
                sum += d;
            }
        }
        if (sum == n) {
            printf("%d\n", n);
        }
    }
    return 0;
}

运行示例

输出:

1
6
28
496