筛素数 [高效]

View Code
/*================================*\
| 筛素数 [1..n]
\*================================*/
bool isp[MM];  int prm[MM];
int get_prime(int n) {
    int i,j,k=0;
    int s, e=(int)(sqrt(0.0+n)+1);
    for(i=0;i<=n;i++) isp[i]=true;
    prm[k++]=2; isp[0]=isp[1]=false;
    for(i=4;i<n;i+=2) isp[i]=false;
    for(i=3;i<e;i+=2) if(isp[i]) {
        prm[k++]=i;
        for(s=(i<<1), j=i*i; j<n ; j+=s) isp[j]=false;
        // 因为j是奇数,所以+奇数i后是偶数,不必处理!
    }
    for(; i<n ; i+=2) if(isp[i]) prm[k++]=i;
    return k;  // 返回素数的个数
}
原文地址:https://www.cnblogs.com/zhang1107/p/3029291.html