码迷,mamicode.com
首页 > 其他好文 > 详细

素数筛法

时间:2017-08-14 16:22:20      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:logs   mesi   for   欧拉   bre   时间复杂度   时间   枚举   style   

一、埃式筛法

 

埃式筛法的核心思想是从2到n枚举,当我们找到一个质数时,枚举它所有的倍数,因为这些倍数都不可能是质数。

for(int i=2; i<=n; i++) {
    if(!vis[i]) {
    prime[++cnt]=i;
    for(int j=i*2; j<=n; j+=i)
        vis[j]=true;
    }
}

时间复杂度是O(n log log n)

如果无论质数合数,每次都去找倍数的话,复杂度会退化成O(n|n n)

二、欧拉筛(线性筛)

  欧拉筛的核心思想是通过让每个数只会被它的最小的质因子筛到,从而每个数只会被筛一次,时间复杂度O(n)

  对于任意一个合数,我们可以拆成最小质因子*某数i的形式。我们枚举某数i,然后在枚举所有筛出的质数。

  当我们枚举的质数可以整除i时,如果再往大里枚举,枚举的质数就不可能是最小质数了,这时就可以终止循环,继续枚举下一个i了

 

for(int i=2; i<=n; i++) {
    if(!isprime[i])
        prime[++primesize]=i;
    for(int j=1; j<=primesize && i*prime[j]<=n; j++) {
        isprime[i*prime[j]]=1;
        if(i%prime[j]==0) break;
    }
}

自己选的路,跪着也要走完!!!

 

素数筛法

标签:logs   mesi   for   欧拉   bre   时间复杂度   时间   枚举   style   

原文地址:http://www.cnblogs.com/wsdestdq/p/7358045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!