1.判断一个数是否为素数

  对于n

  i从2到sqrt(n)依次尝试若不存在i使得n%i==0则为素数

  反之则不是

  时间复杂度sqrt(n)

  或者

  有结论:大于等于5的素数可以表示成6*n-1或6*n+1

  所以可以用该方法来判断素数

void isprime(int x){
    if(x==0||x==1)return 0;
    if(x==2||x==3)return 1;
    if(x%6!=1&&x%6!=5)return 0;
    if(x==4)return 0;
    for(int i=5;i*i<=n;i+=6){
        if(x%i==0||x%(i+2)==0)return 0;
    }
    return 1;
}

2.埃氏筛法

  素数的倍数一定不是素数

  由此可以筛素数

void tprime(){
    memset(p,true,sizeof p);
    p[0]=p[1]=0;
    p[2]=1;
    for(int i=2;i<=maxn;i++){
        if(p[i]){
            for(int j=2*i;j<=maxn;j+=i){
                p[j]=0;
            }
        }
    }
}

3.欧拉筛法

  每个数只会被它最小的质因子筛去

  背过代码就行了(逃

 

void oprime(){
    p[1]=p[0]=0;
    for(int i=2;i<=maxn;i++){
        if(!vis[i]){
            p[++tot]=i;
        }
        for(int j=1;j<=tot&&p[j]*i<=maxn;j++){
            vis[p[j]*i]=1;
            if(i%p[j]==0)break;
        }
    }
}
02-13 18:11