埃氏的质数筛选:把所有质数的倍数都删除,最后留下的就是所有的质数
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1e6+5;
int res=0;
bool st[N];
int p[N];
void getnumber(int n){
for(int i=2;i<=n;i++){
if(!st[i]){
p[res++]=i;
for(int j=i+i;j<=n;j+=i){
st[j]=true;
}
}
}
}
int main(){
int n;
cin >> n;
getnumber(n);
cout << res;
return 0;
}
线性筛选
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N=1e6+5;
int res=0;
bool st[N];
int p[N];
void getnumber(int n){
for(int i=2;i<=n;i++){
if(!st[i]){
p[res++]=i;
}
for(int j=0;p[j]<=n/i;j++){
st[p[j]*i]=true;
if(i%p[j]==0)
break;
}
}
}
int main(){
int n;
cin >> n;
getnumber(n);
cout << res;
return 0;
}