埃拉托斯特尼筛法
vector<int> primer;
vector<bool> rec(n, true);
for (int i = 2; i * i < n; i++) {
if (!rec[i])
continue;
primer.push_back(i);
for (int j = i * i; j < n; j += i)
rec[j] = false;
}
- 时间复杂度:O(nlognlogn)
- 空间复杂度:O(n)
线性筛
vector<int> primer; //保存所有小于n的素数
vector<bool> rec(n, true); //记录是否为素数, true表示是素数
for (int i = 2; i < n; i++) {
if (rec[i])
primer.push_back(i);
for (int j = 0; j < primer.size(); j++) {
rec[i * primer[j]] = false;
if (i % primer[j] == 0) //确保每个合数只会被其最小的质素数访问到
break;
}
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)