原始碼中 flag 變數未在外層迴圈重置,導致第一個質數後所有數字都被判定為非質數。修正核心:每次外層迴圈開始前將 flag 重置為 true,且內層迴圈條件優化為 j*j <= i 或 j <= Math.sqrt(i)。
boolean flag = true; // 錯誤:只初始化一次
for (int i = 2; i <= 100; i++) {
for (int j = 2; j <= i; j++) { // 應為 j < i 或 j*j <= i
if (i % j == 0) { flag = false; break; }
}
if (flag) sum += i;
}
int sum = 0;
for (int i = 2; i <= 100; i++) {
boolean flag = true; // 關鍵:每個 i 重新初始化
for (int j = 2; j * j <= i; j++) { // 優化:只需判斷到 sqrt(i)
if (i % j == 0) { flag = false; break; }
}
if (flag) sum += i;
}
System.out.println(sum); // 輸出 1060
int n = 100;
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= n; j += i) isPrime[j] = false;
}
}
int sum = 0;
for (int i = 2; i <= n; i++) if (isPrime[i]) sum += i;
System.out.println(sum); // 1060,時間複雜度 O(n log log n)
j <= Math.sqrt(i) 或 j*j <= i 即可,因為因數成對出現。修正旗標重置與迴圈邊界,是解決質數判斷邏輯錯誤的關鍵。