前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 204. Count Primes(线性素数筛)

LeetCode 204. Count Primes(线性素数筛)

作者头像
ShenduCC
发布2020-02-20 13:21:31
3140
发布2020-02-20 13:21:31
举报
文章被收录于专栏:算法修养算法修养

题意:求[1-n)中的质数。

题解:判断一个数是否是素数,很简单,

代码语言:javascript
复制
for(int i=2;i * i < x ;i++)
{
    if(x%i==0)
        return false;
}
return true;

但是这样做明显会超时,所以我们用素数筛,来快速的求出1-n的所有素数。素数筛的原理,就是所有素数的倍数都是合数,求出一个素数,就把它的倍数都筛掉。

但是这样有一个问题,就是会筛两次,比如素数2会把30给筛掉,5 也会把30给筛掉。所以这个效率就是O(n)的,O(n)效率的素数筛,是欧拉素数筛。

它的核心思想,我会写另一篇博客介绍下。

代码语言:javascript
复制
class Solution {
public:
    int E[5000005];
    int prime[1000005];
    int check[5000005];
    int pos=0;
    int countPrimes(int n) {
        
        Euler(n);
        
        return pos;
       
        
    }
    
    void Euler(int n)
    {
        check[1]=0;
        
        for(int i=2;i<n;i++)
        {
            if(!check[i])
            {
                prime[pos++]=i;
                E[i] = i-1;
            }
            
            for(int j=0;j<pos;j++)
            {
                if(prime[j]*i>=n)
                    break;
                check[prime[j]*i]=1;
                if(i%prime[j]==0)
                {
                    E[i*prime[j]]=E[i]*prime[j];
                    break;
                }
                else
                    E[i*prime[j]]=E[i]*(prime[j]-1);
            }
        }
    }
    
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档