2 的邏輯缺失,導致輸入 1~100 時輸出 1 而非 2m < b 應為 m <= b 以包含上界sign 未重置,內層循環 break 後外層邏輯混亂<cmath> 頭文件,sqrt 未聲明#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
long a, b, l = 0;
cout << "Please input two numbers (a b): ";
cin >> a >> b;
cout << "Primes from " << a << " to " << b << endl;
// 確保下界至少為 2
if (a < 2) a = 2;
for (long m = a; m <= b; ++m) {
int sqrtm = static_cast<int>(sqrt(static_cast<long double>(m)));
bool isPrime = true;
for (int i = 2; i <= sqrtm; ++i) {
if (m % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
if (l++ % 10 == 0) cout << endl;
cout << setw(5) << m;
}
}
cout << endl;
return 0;
}
| 問題 | 修正 | 說明 |
|---|---|---|
| 1 被誤判為素數 | if (a < 2) a = 2; | 素數定義為大於 1 的自然數 |
| 上界不包含 | m <= b | 符合「從 A 到 B」的自然語義 |
| 標誌位未重置 | 每輪外層循環 bool isPrime = true; | 避免上一輪殘留影響本輪判定 |
| 類型轉換不安全 | static_cast 顯式轉換 | 消除隱式轉換警告,提升可移植性 |
bitset 或動態位圖存儲標記,降低 8 倍內存佔用。$ g++ -std=c++17 -O2 prime.cpp -o prime
$ ./prime
Please input two numbers (a b): 1 100
Primes from 2 to 100
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
掌握邊界條件處理、標誌位管理、類型安全,編寫正確高效的 C++ 素數篩選程序不再是難題。