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;
        }
  • 相关阅读:
    SVN的使用
    ajax 显示,删除,批量删除,修改反填功能实现
    Linux 安装软件的几种方式
    《面向对象软件开发实践》笔记一
    Entity Framework 新手入门友好实例
    MIT 计算机科学及编程导论 Python 笔记 1
    JetBrains套装免费学生授权申请(IntelliJ, WebStorm...)
    我的十月
    关于《未成年人网络保护条例(草案征求意见稿)》的意见
    C# 分隔字符串成为字符串数组的方法(保留分隔符)
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13193036.html
Copyright © 2011-2022 走看看