1.最简单的算法O(√n)
bool isPrime(int n){
for(int i=2;i<int(sqrt(n)+1);i++){
if(n%i==0)
return false;
}
return true;
}
2.埃式筛法算法O(nloglogn)
int prime[MAXN];
bool is_pri[MAXN];
int cnt=0;
void isPrime(int n){
for(int i=0;i<=n;i++) is_pri[i]=1;
is_pri[0] = is_pri[1] = false;
for(int i = 2;i <= n; i++){
if(is_pri[i]){
prime[++cnt] = i;
for(int j=2*i;j<=n;j+=i) 当i满足质数时,筛选出i所有的倍数
is_pri[j]=false;
}
}
}
3.欧拉筛(线性筛)O(n)
时间复杂度最小的最优的筛法,相当于对埃式筛的进一步优化,因为埃式筛的一个合数会被多次筛选,比如20既会被2筛去,也会被5筛一次,所以这是冗余的操作
欧拉筛的理论基础是“任何一个合数都能写成两个质数相乘的形式”,由此可见,对于每一个合数,我们只需要用它的最小质因数把它筛去即可
int prime[MAXN];
bool is_pri[MAXN];
int cnt=0;
void isPrime(int n){
for(int i=0;i<=n;i++) is_pri[i]=1;
is_pri[0] = is_pri[1] = false;
for(int i = 2;i <= n; i++){
if(is_pri[i]){
prime[++cnt] = i;
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]>n)
break;
is_pri[i*prime[j]]=false;
if(i%prime[j]==0)//这时此质数已经是这个合数的最小质因数
break;
}
}
}