质数:在大于1的整数中,如果只包含1和本身这两个约数,那么就是素数

试除法:

 时间复杂度 O(sqrt(n))

代码:

static boolean prime(int n){
        if(n < 2) return false;
        for(int i = 2; i <= n/i; i++){//因为i能被整除,那么n/i肯定也能被n整除
            if(n % i == 0) return false;
        }
        return true;
    }

线性欧拉筛:

合数只会被它的最小质因子筛掉

时间复杂度:O(n)

        static final int N=;
        static int prime[]=new int[N];
        static boolean vis[]=new boolean[N];
        static int cnt=0;
        static void get_primes(int n){
            for(int i=2;i<=n;i++){
                    if(!vis[i]) prime[cnt++]=i;
                    for(int j=0;j<cnt && prime[j]*i<=n;j++){
                            vis[i*prime[j]]=true;
                            if(i%prime[j]==0) break;//prime[j]是i的最小质因子,那么prime[j]肯定也是i*prime[j]的最小质因子
                    }
            }
        }

 

埃式筛法:

时间复杂度: O(n*loglogn)在N=10^6,时间和线性欧拉筛法差不多,但是10^7线性欧拉筛法就快了一倍

一个数为素数,那么它的倍数肯定不是素数

代码:

        static final int N=;
        static int prime[]=new int[N];
        static boolean vis[]=new boolean[N];
        static int cnt=0;
        static void get_primes(int n){
                for(int i=2;i<=n;i++){
                        if(!vis[i]){
                                vis[i]=true;
                                prime[cnt++]=i;
                                for(int j=i+i;j<=n;j+=i)
                                     vis[j]=true;
                        }
                }
        }                    

 

posted on 2020-02-04 13:40  qdu_lkc  阅读(242)  评论(0编辑  收藏  举报