其他分享
首页 > 其他分享> > 求给定范围内的所有质数

求给定范围内的所有质数

作者:互联网

今天刷到了一到比较有趣的题

题目描述为:求小于n的所有质数

比较快速的办法是使用艾拉托斯特尼筛法

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。

给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。

Java实现如下:

public int countPrimes(int n) {
        boolean[] isNotPrime = new boolean[n];
        int count = 0;
        for(int i=2;i<n;i++){
            if(!isNotPrime[i]){
                isNotPrime[i] = false;
                count++;
                for(int j=1;i*j<n;j++){
                    isNotPrime[i*j]=true;
                }
            }
        }
        return count;
    }

在这个基础上,可以改写出求某一个范围内的所有素数,实现如下:

// 埃拉托斯特尼筛法
    ArrayList<Integer> list = new ArrayList<Integer>();
    public void add(int n) {
        boolean[] isNotPrime = new boolean[n];
        int count = 0;
        for(int i=2;i<n;i++){
            if(!isNotPrime[i]){
                isNotPrime[i] = false;
                list.add(i);
                for(int j=1;i*j<n;j++){
                    isNotPrime[i*j]=true;
                }
            }
        }
    }
    public void remove(int n) {
        boolean[] isNotPrime = new boolean[n];
        int count = 0;
        for(int i=2;i<n;i++){
            if(!isNotPrime[i]){
                isNotPrime[i] = false;
                list.remove(Integer.valueOf(i));
                for(int j=1;i*j<n;j++){
                    isNotPrime[i*j]=true;
                }
            }
        }
    }
    public void total(int low, int high){
        add(high);
        remove(low);
    }

也许还能写得更简洁,但博主近来比较的忙,有空的话再改改。

标签:斯特尼,int,质数,素数,给定,boolean,埃拉托,范围
来源: https://blog.csdn.net/Poe2017/article/details/100013417