逐個數試除法 (`n % p == 0`) 複雜度 O(N√N / log N),20 萬質數 (約第 20 萬質數 ~ 275 萬) 遠超 1 秒。
#include
using namespace std;
const int LIMIT = 3000000; // 第 20 萬個質數約 275 萬,留餘量
vector primes;
bool is_composite[LIMIT + 1];
void linear_sieve() {
for (int i = 2; i <= LIMIT; ++i) {
if (!is_composite[i]) primes.push_back(i);
for (int p : primes) {
long long v = 1LL * i * p;
if (v > LIMIT) break;
is_composite[v] = true;
if (i % p == 0) break; // 核心:每個合數只被最小質因子篩一次
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
linear_sieve();
for (int i = 0; i < 200000; ++i) {
cout << primes[i] << '\n';
}
return 0;
}
參考代碼:線性篩 1 秒內輸出 20 萬質數。