素數篩法(模板)

質數:在大於1的整數中,若是隻包含1和自己這兩個約數,那麼就是素數

試除法:

 時間複雜度 O(sqrt(n))spa

代碼:code

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;
    }

線性歐拉篩:

合數只會被它的最小質因子篩掉blog

時間複雜度:O(n)get

        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線性歐拉篩法就快了一倍class

一個數爲素數,那麼它的倍數確定不是素數im

代碼:static

        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;
                        }
                }
        }                    
相關文章
相關標籤/搜索