素数筛

常用素数筛

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\n",tot);         //质数的个数
}   

原文链接: https://www.cnblogs.com/StungYep/p/12252418.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    素数筛

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/326653

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午3:54
下一篇 2023年3月1日 下午3:55

相关推荐