完全數是指其所有真因子(不包括自身)之和等於自身的數。例如 6 = 1+2+3,28 = 1+2+4+7+14。題目要求編寫 C 語言程式,找出 2 到 20000 之間的所有完全數,並輸入整數 n,輸出第 n 個完全數。
提問者提供的代碼中,判斷是否為完全數的 `if (i == s)` 被錯誤地放在了內層循環(遍歷因子)內部。這導致在累加因子的過程中,只要中間某一步 `s` 恰好等於 `i`,就會誤判為完全數並增加計數器 `k`,最終導致輸出結果錯誤甚至無輸出。
#include <stdio.h>
int main() {
int i, n, s = 0, k = 0;
printf("請輸入要查找的完全數序號: ");
scanf("%d", &n);
for (i = 2; i <= 20000; i++, s = 0) {
// 優化:因子最大不超過 i/2
for (int j = 1; j <= i / 2; j++) {
if (i % j == 0) {
s += j;
}
}
// 判斷完全數的邏輯必須放在內層循環結束後
if (i == s) {
k++;
if (k == n) {
printf("第 %d 個完全數是: %d\n", n, i);
break;
}
}
}
if (k < n) {
printf("在 20000 範圍內不足 %d 個完全數。\n", n);
}
return 0;
}
在 20000 範圍內僅存在 4 個完全數:6、28、496、8128。若輸入 n > 4,程式會提示不足。