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; } } }