质数:在大于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; } } }