for (i = min; i <= max; i++) {
for (j = 2; j <= i && i % j != 0; j++)
; // 空循環體
if (j >= i)
count++; // 統計素數
}
遍歷待檢測數字 `i`,範圍 `[min, max]`。
**尋找最小因數**:從 `j=2` 開始嘗試整除 `i`。
內層循環等價於:
boolean isPrime = true;
for (j = 2; j * j <= i; j++) { // 優化:只需試除到 sqrt(i)
if (i % j == 0) { isPrime = false; break; }
}
if (isPrime) count++;
原代碼 `j <= i` 未優化,效率較低(O(n²)),但邏輯正確。
#include
#include
int countPrimes(int min, int max) {
int count = 0;
for (int i = min; i <= max; i++) {
if (i < 2) continue; // 0,1 非素數
int isPrime = 1;
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) { isPrime = 0; break; }
}
if (isPrime) count++;
}
return count;
}
int main() {
printf("100 以內素數個數: %d\n", countPrimes(2, 100)); // 25
return 0;
}
`j >= i` 是**試除法素數判定**中「無因數」的標記。理解 `for` 循環「條件為真繼續、為假終止」的語義,結合 `i % j != 0` 的邏輯,即可清晰掌握此雙重循環的素數篩選機制。生產代碼務必加入 `j * j <= i` 優化。