#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
bool st[N];
int prime[N],cnt;
朴素法
void get_prime(int n ){
for(int i = 2;i <= n;i++){
if(!st[i]){
prime[++cnt] = i;
}
// 从 i+i 开始筛 , 2-n的所有数的倍数都筛掉,其实是不用的。
for(int j = i + i;j <= n;j += i){
st[j] = 1;
}
}
}
时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
n + n / 2 + . . . . n / n = n ( 1 + 1 / 2 + 1 / 3 + 1 / 4 + 1 / 5 + . . . + 1 / n ) n + n/2 +.... n/n = n(1 + 1/2 + 1/3 + 1/4 + 1/5 + ... + 1/n) n+n/2+....n/n=n(1+1/2+1/3+1/4+1/5+...+1/n)
筛倍法
void get_prime2(int n ){
for(int i = 2;i <= n;i++){
if(!st[i]){
prime[++cnt] = i;
// 就比如 i = 2,就已经筛了它的倍数,就不需要筛 4的倍数
for(int j = i + i;j <= n;j += i){
st[j] = 1;
}
}
}
}
时间复杂度 O ( n l o g l o g n ) O(nloglogn) O(nloglogn)
线性法
void get_prime3(int n){
for(int i = 2;i <= n;++i){
// 如果不是素数,则
if(!st[i]){
prime[cnt++] = i;
}
for(int j = 0;prime[j] <= n / i;++j){
// 例如6是2的倍数,则6就被筛掉,而不会因为3被再筛一次,因此每一个元素都被访问一次
st[prime[j] * i] = true;
if(i % prime[j] == 0) break;
}
}
}
时间复杂度 O ( n ) O(n) O(n)
int main(){
int N = 100;
get_prime3(N);
for(int i = 0;i < cnt;i++){
cout << prime[i] << " ";
}
return 0;
}