千万级别素数个数(埃氏算法)

@

素数:只能被自己和1整除的数


brute force 暴力解法


public class Prime{

    // 判断一个数是不是质数
    public boolean isPrime(int num){
        for(int i=2;i<num;++i){
            if(num%i==0){
                return false;
            }
        }
        return true;
    }   

    public static int numOfPrime(num){
        int res=0;
        for(int i=1;i<num;++i){
            if(isPrime(i)){
                res++;
            }
        }
        return res;
    }

    public static void main(String[]args){
        int num=100000000;
        int result=numOfPrime(num);
        System.out.println("the prime num is:"+result+"of "+num);

    }

}

埃拉托斯特尼筛法_埃氏筛法求素数

算法步骤

  • 1.先列出2数字之后的所有元素 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25

  • 2.标记序列中第一个未标记的素数 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25

  • 3.把素数2后面序列中2的倍数除掉 2,3,5,7,9,11,13,15,17,19,21,23,25

  • 4.当前序列中最大的数小于最后标记素数的平方,序列中所有数都是素数;如果大于的话,继续执行步骤2,3,4;

(2^2=4 < 25) 重复步骤2

2,3,5,7,9,11,13,15,17,19,21,23,25(步骤2)
2,3,5,7,11,13,17,19,23,25(步骤3)
(3^2=9 <25)

2,3,5,7,11,13,17,19,23,25(步骤2)
2,3,5,7,11,13,17,19,23(步骤3)

(5^2=25> 23)

结果为:

2,3,5,7,11,13,17,19,23


埃氏筛法-算法实现

public class CountPrime{

    public static int prime(int num){
        // 默认都是0,素数
        int[] arr=new int[num];

        arr[1]=1;
        arr[2]=0;   // 标记是否为素数

        double boundary=Math.sqrt(num+0.5);
        //验证步骤4
        for(int i=2;i<boundary;++i){
            if(arr[i]==0){
                // 步骤3
                for(int j=i*i;j<num;j=j+i){
                    arr[i]=1;
                }
            }
        }
        int res=0;
        for(int i=0;i<num;++i){
            if(arr[i]==0){
                res++;
            }
        }
        return res;

    }

    public static void main(String[] args){
        int num=100000000;
        int count=prime(num);
        System.out.println(count);
    }
}

public static void main(String[] args) {
   System.out.println(getZS(10000000));
 }    
 ///获取质数个数
 public static int getZS(long n) {
     int result = 0;
     for (int i = 1; i <= n; i++) {
         if(isPrime(i))
             result++;
     }
     return result;
 }
 /// 高效判断是否为质数
 public static boolean isPrime(long num)
 {
     if (num < 2)
         return false;
     if (num == 2 || num == 3)
     {
         return true;
     }
     if (num % 6 != 1 && num % 6 != 5)
     {
         return false;
     }
     int sqr = (int)Math.sqrt(num);
     for (int i = 5; i <= sqr; i += 6)
     {
         if (num % i == 0 || num % (i + 2) == 0)
         {
             return false;
         }
     }
     return true;
 }

参考链接


问题来源
埃拉托斯特尼筛法-hava a cat

原文地址:https://www.cnblogs.com/GeekDanny/p/11711681.html