前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >筛法求素数

筛法求素数

作者头像
你的益达
发布2020-09-16 09:52:38
4250
发布2020-09-16 09:52:38
举报

给定N,求解1 ~ N的所有素数。

一般做法为依次判断2 ~ N是否为偶数,其时间复杂度为O(N ^ 2)

筛法大体思路:

根据素数定义可知,若某个数能被其他素数整除,则其一定不为素数,因此可以依次筛掉1 ~ N中不是素数的数,剩下的即为所求。

代码语言:javascript
复制
     public List<Integer> getPrime(int N){
         boolean[] nonPrime = new boolean[N + 1];
         List<Integer> ans = new ArrayList<>();
         for(int i = 2; i <= N; i++) {
             if(nonPrime[i]) {
                 continue;
             }
             ans.add(i);
             for(int j = i; j * i <= N; j++) {
                 nonPrime[i * j] = true;
             }
         }
         return ans;
     }

筛法求素数过程中,我们发现对于每个元素,最多被访问2次。因此其时间复杂度为O(N),由于使用了额外boolean[] nonPrime,因此额外空间复杂度亦为O(N)。

一个应用:孪生素数的求解

孪生素数定义:间隔为2的两个素数。(例如 (3, 5),(5, 7),(11, 13))

求解小于N的孪生素数的对数。

代码语言:javascript
复制
     public int countTwicePrime(int N) {
         boolean[] nonPrime = new boolean[N + 1];
         int count = 0;
         int prePrime = 2;
         for(int i = 2; i <= N; i++) {
             if(nonPrime[i]) {
                 continue;
             }
             if(i - prePrime == 2) {
                 count++;
             }
             prePrime = i;
             for(int j = i; j * i <= N; j++) {
                 nonPrime[i * j] = true;
             }
         }
         return count;
     }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 筛法大体思路:
  • 一个应用:孪生素数的求解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档