完全數(Perfect Number),又稱完美數,是指其所有真因子(不包括自身的約數)之和等於自身的自然數。最小的完全數是 6(1+2+3=6),其次是 28(1+2+4+7+14=28)、496、8128……
#include <stdio.h>
#include <math.h>
// 計算真因子和(優化至 √n)
int sum_proper_divisors(int n) {
if (n <= 1) return 0;
int sum = 1; // 1 是所有 n>1 的真因子
int limit = (int)sqrt(n);
for (int i = 2; i <= limit; i++) {
if (n % i == 0) {
sum += i;
int complement = n / i;
if (complement != i) { // 避免平方數重複加加
sum += complement;
}
}
}
return sum;
}
int main() {
printf("1000 以內的完全數及其分解:\n");
for (int i = 2; i <= 1000; i++) {
if (sum_proper_divisors(i) == i) {
// 格式化輸出:6 = 1 + 2 + 3
printf("%d = 1", i);
for (int j = 2; j < i; j++) {
if (i % j == 0) printf(" + %d", j);
}
putchar('\n');
}
}
return 0;
}
若 i 是 n 的因子,則 n/i 也是因子。只需遍歷到 √n,成對累加,時間複雜度從 O(n) 降為 O(√n)。
n=1:無真因子,和為 01000 以內的完全數及其分解:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
所有偶數完全數均符合形式:2^(p-1) × (2^p - 1),其中 2^p - 1 是梅森質數(Mersenne Prime)。
截至2024年,僅發現51個梅森質數,對應51個偶數完全數。奇數完全數是否存在仍是數學未解之謎。
本文修正了原代碼的輸出格式問題(避免重複因子),並引入√n優化策略。理解完全數的數學本質與因子配對規律,不僅能寫出高效代碼,更能觸類旁通解決相關約數問題(如親和數、虧數/盈數判斷)。