ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

判断十亿以内素数的个数

2021-07-03 16:02:28  阅读:224  来源: 互联网

标签:tags 个数 最小 素数 num primes 质因数 十亿


import java.util.ArrayList;
import java.util.List;
//算法原理:从2开始,将[2, 根号n]中每个素数当作最小质因数去标记合数,剩下的就都是素数。(对比埃氏筛法理解)
//时间复杂度:O(n)
/*
  算法中break那行代码的原理最难理解,作用就是弥补埃氏筛法的不足,防止重复筛除合数。

  代码含义:如果当前素数primes.get(j)是数字i的最小质因数,那么后面的素数就不可能是数字i及其倍数的最小质因数。

  举个例子:假如当前数字是8,当前素数是2,理应跳出循环。如果继续,那么下一个素数是3,所以8*3=24 ,但是24的最小质因数是2不是3,再继续8*4=32 ,32的最小质因数是2不是5,以此类推,可以发现8及其倍数的最小质因数都应该是2,所以到2这里就应该跳出循环了。
*/
public class Primes {
    public static List<Integer> getPrimes(int num){
        List<Integer> list = new ArrayList<>();
        if(num == 0 || num == 1){
            return list;
        }
        boolean[] tags = new boolean[num+1];
        //true代表不是素数
        tags[0] = true;
        tags[1] = true;
        for(int i = 2; i <= num;i++){
            if(!tags[i]){
                list.add(i);
            }
            for(int j = 0; j < list.size() && i * list.get(j) <= num; j++){
                tags[i * list.get(j)] = true;
                if(i % list.get(j) == 0){
                    break;
                }
            }
        }
        System.out.println(list.size());
        return list;
    }

    public static void main(String[] args) {
        List<Integer> primes = getPrimes(1000000000);
        System.out.println(primes);
    }
}

标签:tags,个数,最小,素数,num,primes,质因数,十亿
来源: https://www.cnblogs.com/chyEric/p/14966549.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有