zoukankan      html  css  js  c++  java
  • 是否为质数

    思路为:

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

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

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

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

     如果求前n个(不包含n)全部的质数数组则代码如下:

     public static int[] getPrimes(int n){
            if(n<2)return null;
            int count=0;
            boolean[] notPrimes=new boolean[n];
            //偶数只有2是质数
            for(int i=3;i<n;i+=2){
                if(!notPrimes[i]){
                    count++;
                    for(long j=i;j*i<n;j+=2){
                        notPrimes[(int) (i*j)]=true;
                    }
                }
            }
            int[] res=new int[count+1];
            res[0]=2;
            int index=1;
            for(int i=3;i<n;i+=2){
                if(!notPrimes[i]){
                    res[index]=i;
                    index++;
                }
            }
            return res;
        }
  • 相关阅读:
    2008年Web2.0峰会:发展是绝对的硬道理
    盖茨"接班人":微软产品为何总是挨批
    如何使用命令方式检测mx记录是否生效
    IBM公布未来5年将改变人类生活的五大科技
    谷歌李开复:我的传奇人生源于十句箴言
    VCL已死,RAD已死(3)
    VCL已死,RAD已死(2)
    主要程序设计语言范型综论与概要
    谷歌正式放弃与雅虎的广告合作计划
    模仿google分页代码
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13193036.html
Copyright © 2011-2022 走看看