原题链接:
题解:
常见的筛选质数的方法包括:普通筛法O(nlogn)、诶氏筛法 O(nloglogn)、线性筛法|欧式筛 O(n)
一般的筛选质数的题用线性筛即可解决,但是有些比较ex的题就需要用到诶氏筛法,如:
Prime Distance - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
关于线性筛,可以参考下面这篇文章:
算法学习笔记(17): 素数筛 - 知乎 (zhihu.com)
代码:
//欧式筛(线性筛)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n;
vector<int> primes;//存储质因数的数组
int st[N];//表示某个质因数是否已经被筛过
void get_prime(int x) {
for (int i = 2;i <= n;i++) {
if (!st[i])
primes.push_back(i);
for (auto p : primes) {
if (p * i > n) break;
st[p * i] = 1;
if (i % p == 0) break;//确保是由最小质因数筛掉的
}
}
}
int main() {
cin >> n;
get_prime(n);
cout << primes.size();
}