正整數 n 若等於其所有真因子(不含自身)之和,則為完全數。
已知最小完全數:6 (1+2+3)、28 (1+2+4+7+14)、496、8128...
i (1..N),檢查 j (1..i-1) 是否為因子 → O(N²)√i → O(N√N)#include <stdio.h>
int main()
{
int limit;
printf("請輸入上限 N: ");
scanf("%d", &limit);
printf("%d 以內的完全數:\n", limit);
int found = 0;
for (int i = 2; i <= limit; i++) { // 1 無真因子
int sum = 0;
for (int j = 1; j <= i/2; j++) { // 優化:只需檢查到 i/2
if (i % j == 0) sum += j;
}
if (sum == i) {
printf("%d ", i);
found = 1;
}
}
if (!found) printf("無\n");
printf("\n");
return 0;
}
請輸入上限 N: 10000
10000 以內的完全數:
6 28 496 8128
2^(p-1) × (2^p - 1) 為完全數,若 2^p - 1 為質數(梅森質數)
int sumDivisors(int n) {
int sum = 1; // 1 是所有 n>1 的因子
for (int d = 2; d*d <= n; d++) {
if (n % d == 0) {
sum += d;
if (d != n/d) sum += n/d; // 配對因子
}
}
return (n==1) ? 0 : sum;
}