Eratosthenes筛法

#include<bits/stdc++.h>
#define maxn 1000010
using namespace std;

int x;
int cnt,isprime[maxn];
bool notprime[maxn];

void shai(int n){
    for(int i=2;i<=n;i++){
        if(notprime[i]==false){
            isprime[++cnt]=i;//把i加到质数表中,cnt计数1 
            for(int j=2;j<=n/i;j++)
                notprime[j*i]=true;//把所有i的倍数标记为notprime 
        }
    }
}

int main(){
    cin>>x;
    shai2(x);
    for(int i=1;i<=cnt;i++)
        cout<<isprime[i]<<" ";
    cout<<endl;
    return 0;
} 

还可以优化常数:

void shai2(int n){//优化 
    for(int i=2;i<=n;i++){
        if(notprime[i]==false){
            isprime[++cnt]=i; 
            for(int j=i*i;j<=n;j+=i)//前面的已经筛过了,从i*i开始可加速,注意不影响复杂度 
                notprime[j]=true;//把所有i的倍数标记为notprime 
        }
    }
}
原文地址:https://www.cnblogs.com/DReamLion/p/14365121.html