埃氏(质数)筛法
单个质数判断:
bool isprime(int x){
if(x==1){
return false;
}
for (int i=2; i<=sqrt(x); i++) {
if(x%i==0){
return false;
}
}
return true;
}
i<=sqrt(x)
原理
质数筛条件
不误判
不漏判
代码
bool is_prime[...];
memset(is_prime,ture,sizeof(is_prime));
int t=sqre(n);
is_prime[1]=false;
for(int i=2;i<=t;i++){
if(is_prime[i])
for(int j=i;i*j<=n;j++)
is_prime[i*j]=false;
时间复杂度:
O(√n)
优点:好写,不漏筛
缺点:筛多次
欧拉(线性)筛法
原理
每个合数都有最小质因子
代码:
bool is_prime[...];
int prime[...];
int k=0;
memset(is_prime,ture,sizeof(is_prime));
for(int i=2;i<n;i++){
if(is_prime[i]) prime[k++]=i;
//-----------------------
for(int j=0;j<k;j++){
int t=1*prime[j];
if(t>n )break;
is_prime[t]=false;
if(i%prime[j]) break;
}
}