代碼片段:
for (i = 100; i <= 200; i++)
for (j = 2; j <= sqrt(i); j++)
if (i % j == 0) break;
else if (j > sqrt(i) - 1) { /* 輸出質數 */ }
問題:i=101 時,sqrt(101) ≈ 10.0499,sqrt(i)-1 ≈ 9.0499。內層循環 j 從 2 遞增至 10(因 j <= sqrt(i))。當 j=10 時,10 > 9.0499 為真,**會輸出 101**(質數)。
2 ~ sqrt(n) 無因數。j > sqrt(i) 時退出,若未 break,說明無因數。else if (j > sqrt(i) - 1) 近似判斷「循環正常結束」,對整數 j 等價。double limit = sqrt(i);
for (j = 2; j <= limit; j++) {
if (i % j == 0) break;
}
if (j > limit) printf("%d ", i); // 更清晰、避免重複 sqrt
sqrt(i) 到變量,避免重複計算。j > limit,語義明確。理解浮點數比較與循環邊界,寫出高效質數篩選代碼。