**完數** = 真因子 (不含自身) 之和等於自身。如 6 (1+2+3)、28 (1+2+4+7+14)。
int factor_sum(int n) {
if (n <= 1) return 0;
int sum = 1; // 1 永遠是因子
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
sum += i;
if (i != n / i) sum += n / i; // 避免平方數重複加
}
}
return sum;
}
sqrt(n),成對累加,複雜度 O(sqrt(n))。n=1 無真因子,和為 0。
#include <stdio.h>
int factor_sum(int n);
int main() {
int m, n;
while (1) {
printf("請輸入 m n (m>=1, n<=1000, m<=n),輸入 0 0 結束:");
if (scanf("%d %d", &m, &n) != 2) break;
if (m == 0 && n == 0) break;
if (m < 1 || n > 1000 || m > n) {
puts("輸入範圍錯誤");
continue;
}
int found = 0;
for (int i = m; i <= n; i++) {
if (i == factor_sum(i)) {
printf("%d ", i);
found = 1;
}
}
if (!found) printf("無完數");
putchar('\n');
}
return 0;
}
6, 28, 496
// 下一個 8128 > 1000
2^(p-1) * (2^p - 1) 為完數,若 2^p - 1 為梅森素數。