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


    @

    素数:只能被自己和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

  • 相关阅读:
    FTP上传/下载文件栗子
    WEB上传大文件解决方案
    SQL分页新语法
    CTE实现树形结构查询
    无索引状态下比较DataTable的几种过滤方法效率
    CodeSmith模板
    一. DotNet MVC4.0+EasyUI Web简单框架-前言
    关于Winform 2.0以后多线程不能更新UI的办法
    NHibernate Demo 和 效率测试
    构建Vue+Ionic+Cordova项目,开发全平台APP系列教程
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/11711681.html
Copyright © 2020-2023  润新知