素数筛

常用素数筛

1.暴力

bool primes(int x)
{
    for(int i=2;i<=x/i;++i){
     	if(x%i==0)	return false;   
	}
    return true;
}

2.埃拉托斯特尼筛法(埃氏筛法)

void Primes(int x)  
{  
    for (int i=0;i<=x;++i) prime[i]=1;    //先把每个数都定义为合数
    prime[0]=prime[1]=0;  
    for (int i=2;i<=x;i++)  
    {  
        if (!prime[i]) continue;  
        for (int j=i+i;j<=x;j+=i) prime[j] = 0;  //将i的倍数标记为合数
    }  
}

该筛法可以引申为一种思想,绝不仅限于用于筛素数

3.线性筛法

该筛法是基于唯一分解定理之上

铺垫:唯一分解定理:任何大于1的自然素都可以写成有限个质数的乘积

int vis[maxn],prime[maxn];		//判断是否是质数和储存质数
inline void primes(int x){
    for(int i=1;i<=x;++i){
        vis[i]=tot=0;
    }
    for(int i=2;i<=x;++i){
        if(vis[i]==0)   prime[++tot]=i;
        for(int j=1;prime[j]<=x/i;++j){
            vis[prime[j]*i]=1;
            if(i%prime[j]==0)   break;  //prime[j]一定是i的最小质因子
        }
    }
    printf("%d
",tot);         //质数的个数
}   
原文地址:https://www.cnblogs.com/StungYep/p/12252418.html