定義:一個正整數如果恰好等於它的真因子(不包含自身的因子)之和,則稱為「完數」或「完美數」。例如:6 = 1 + 2 + 3,28 = 1 + 2 + 4 + 7 + 14。
ii,找出所有小於 i 的因子 j(即 i % j == 0)sumsum == i,則輸出該完數public class PerfectNumberFinder {
public static void main(String[] args) {
int count = 0;
System.out.println("1000 以內的完數有:");
for (int i = 2; i < 1000; i++) {
int sum = 0;
// 優化:只需遍歷到 sqrt(i),成對收集因子
for (int j = 1; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
sum += j;
int paired = i / j;
if (paired != j && paired != i) { // 排除自身與重複因子
sum += paired;
}
}
}
if (sum == i) {
System.out.println(i);
count++;
}
}
System.out.println("1000 以內的完數一共有 " + count + " 個。");
}
}
1000 以內的完數有:
6
28
496
1000 以內的完數一共有 3 個。

原始雙層循環時間複雜度為 O(n²)。優化版利用因子成對出現特性(若 j 是因子,則 i/j 也是因子),將內層循環縮減至 sqrt(i),複雜度降為 O(n√n)。對於 1000 以內數據量雖無明顯差異,但對擴展至百萬級數據至關重要。
6 = 1 + 2 + 3)