源本科技 | 码上会

完数查找问题

2026/01/26
12
0

题目

一个数如果恰好等于它的因子之和,这个数就称为 "完数"。例如6=1+2+36 = 1 + 2 + 3。编程找出 1000 以内的所有完数。


说明

完数是指一个正整数,它等于其所有真因子(即除了自身以外的正因子)之和。

  • 例如:6 的真因子是 1, 2, 3,且1+2+3=61 + 2 + 3 = 6,所以 6 是完数。

  • 注意:1 没有真因子(因为真因子必须小于该数),所以 1 不是完数。


运行示例

程序运行后输出:

6 its factors are:  1, 2, 3, 
28 its factors are:  1, 2, 4, 7, 14, 
496 its factors are:  1, 2, 4, 8, 16, 31, 62, 124, 248, 

注:1000 以内只有三个完数:6、28、496


👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

完数非常稀少,且与梅森素数密切相关。

欧几里得证明了:
2p12^p - 1 是素数(称为梅森素数),则 2p1(2p1)2^{p-1}(2^p - 1)
是一个偶完数。

前几个对应关系:

pp

2p12^p - 1(是否素数)

完数2p1(2p1)2^{p-1}(2^p - 1)

2

3(是)

21×3=62^1 \times 3 = 6

3

7(是)

22×7=282^2 \times 7 = 28

5

31(是)

24×31=4962^4 \times 31 = 496

7

127(是)

26×127=81282^6 \times 127 = 8128

8128 超出 1000,故不在结果中。

至今未发现奇完数,数学界普遍认为可能不存在奇完数,但尚未被证明。


程序实现

public class Demo09 {
    public static void main(String[] args) {
        for (int i = 2; i < 1000; i++) { // 从2开始,1不可能是完数
            int sum = 0;
            // 只需检查到 i/2
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    sum += j;
                }
            }
            if (sum == i) {
                System.out.print(i + " its factors are: ");
                for (int j = 1; j <= i / 2; j++) {
                    if (i % j == 0) {
                        System.out.print(j + ", ");
                    }
                }
                System.out.println();
            }
        }
    }
}

补充知识

  • 历史:完数的研究可追溯至古希腊毕达哥拉斯学派(公元前 6 世纪),他们认为完数具有神秘和谐之美。

  • 已知完数:截至 2024 年,人类共发现 51 个完数,全部为偶数,且都符合欧几里得 - 欧拉公式。

  • 最大已知完数:对应p=82,589,933p = 82,589,933,有超过 4900 万位数字