你真的会求1-100有多少个素数吗

素数定义:

该数只能被1和它本身整除(1不是素数)

解法不断优化版:

  • 定义一个函数判断是否是素数
  • 判断函数的优化,循环只需要从[2,sqrt(n))即可。
  • 使用排除法的思想,2是素数 2的整数倍(2倍以上)不是素数;3是素数,3的整数倍不是素数 等等
  • 再上述方法再加上循环的优化,循环只需要从[2,sqrt(n))即可。

代码如下

package general_tips;

import java.util.Arrays;

public class CountPrimes {
    public static void main(String[] args) {
        CountPrimes c = new CountPrimes();
        System.out.println( c.countPrime(100));
        System.out.println( c.countPrime1(100));
        System.out.println( c.countPrime2(100));

    }

    /**
     * 原始方法,先定义一个函数判断是否是素数,然后再循环统计
     * @param n
     * @return
     */
    public int countPrime(int n){

        int count=0;
        for(int i=0;i<=n;i++){
            if(isPrime(i)) count++;
        }
        return count;
    }

    /**
     * 利用排除法的思想,判断[2,n]有几个素数
     * @param n
     * @return
     */
    public int countPrime1(int n){
        //初始化一个布尔类型的数组,将其都设置为true;
        //循环遍历,将2的整数被都设置为false
        //最后计数
        boolean flag[]=new boolean[n+1];
        Arrays.fill(flag,true);
        for(int i=2;i<n+1;i++){
            if(flag[i]){
                for(int j=2*i;j<n+1;j+=i){
                    flag[j]=false;
                }
            }
        }
        int count=0;
        for(int i=2;i<n+1;i++){
            if(flag[i]) count++;
        }

        return count;
    }
    public int countPrime2(int n){

        boolean flag[]=new boolean[n+1];
        Arrays.fill(flag,true);
        for(int i=2;i*i<n+1;i++){
            if(flag[i]){
                //前面的有些数已经置为false了,不需要重复
                for(int j=i*i;j<n+1;j+=i){
                    flag[j]=false;
                }
            }
        }
        int count=0;
        for(int i=2;i<n+1;i++){
            if(flag[i]) count++;
        }
        return count;
    }
    public boolean isPrime(int n){
        if(n<=1) return false;
        for(int i=2;i<n;i++){
            if(n%i==0) return false;
        }
        return true;
    }
    public boolean isPrime2(int n){
        //比如n=12只需要判断它能否被[2,sqrt(n))之间的数整除,因为前后是对称的
        if(n<=1) return false;
        for(int i=2;i*i<n;i++){
            if(n%i==0) return false;
        }
        return true;
    }
}

原文地址:https://www.cnblogs.com/treasury/p/12748435.html