時間複雜度 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; } } }