是否为质数

思路为:

  1->2是质数,所有是偶数的都是2的倍数一定不是质数(除了2,偶数一定不是质数,因此我们不需要考虑任何偶数

  2.->从3开始考虑到n的奇数,其中某个数,如3的所有整数倍的数都不是质数,我们需要找到不小于n为止,即全部考虑到

    ->这样的话,当我们遍历到9的时候,因为9不是第一次出现,他已经被3考虑为非质数了。

 //代码如下:

 public int countPrimes(int n) {
        int res=0;
        if(n>2) res++;
        else return res;
        boolean[] isPrime=new boolean[n];
        isPrime[2]=true;
        //偶数一定不是质数,因此我遍历所有奇数寻找质数
        for(int i=3;i<n;i+=2){
            if(!isPrime[i]){//如果是质数
                res++;
                for(int j=3;i*j<n;j+=2){
                    isPrime[i*j]=true;
                }
            }
        }
        return res;
    }

 //当我们为3的时候已经把n内所有3的倍数都设置过了,当为5的时候我们就没必要再去设置*3了,当为7的时候就没有必要设置*3和*5的了,由此我们优化为下方代码

每次直接从他的本身为倍数起始即可!

int res=0;
        if(n>2) res++;
        else return res;
        boolean[] isPrime=new boolean[n];
        isPrime[2]=true;
        //偶数一定不是质数,因此我遍历所有奇数寻找质数
        for(int i=3;i<n;i+=2){
            if(!isPrime[i]){//如果是质数
                res++;
                for(long j=i;i*j<n;j+=2){
                    isPrime[(int) (i*j)]=true;
                }
            }
        }
        return res;

猜你喜欢

转载自www.cnblogs.com/ningxinjie/p/13193036.html