二逼 普通 文艺的素数筛选法

来源:互联网 发布:大型网络动作游戏 编辑:程序博客网 时间:2024/05/16 07:40

二逼的素数筛选法

2b的筛选法,不多说。

const int N=1000000;bool pr[N];int p[N],lp;bool isprime(int x){    for(int i=2;i*i<=x;i++)        if(x%i==0) return 0;    return 1;}void initp(){    for(int i=2;i<N;i++)        if(isprime(i)){            pr[i]=1;            p[lp++]=i;        }}



普通的素数筛选法

用到了素数筛选的思想,但是很明显一些数被重复筛选。

普通筛选法1

const int N=100000;bool pr[N];int p[N],lp;void initp(){    for(int i=2;i<N;i++)     {if(!pr[i]){            p[lp++]=i;                  for(int j=i+i;j<N;j+=i)                  pr[j]=1; }      }} 

普通筛选法2


const int N=100000;bool pr[N];int p[N],lp;void initp(){for(int i=4;i<N;i+=2)pr[i]=1;    for(i=2;i<N;i++)        if(!pr[i]){            p[lp++]=i;            if(N/i>=i)                for(int j=i*i;j<N;j+=i*2)                    pr[j]=1;        }}
普通筛选法3
void calprime(){    long long i,j;    memset(vis,0,sizeof(vis));    priLen = 0;    for(i = 2; i <= M; i++)         if(!vis[i]){            prime[priLen++] = i;        for(j = i*i; j <=M; j+=i)            vis[j] = 1;    }}


文艺的素数筛选法

保证了每个数只被筛选一次,且是被最小质因数筛选,时间复杂度达 到o(n)。

const int N=1000000;int pr[N],p[N/10],lp;void gp(){    for(int i=2;i<N;i++)    {        if(!pr[i])p[lp++]=pr[i]=i;        for(int j=0;j<lp && i*p[j]<N;j++){            pr[i*p[j]]=p[j];            if(i%p[j]==0)break;        }    }}