安利视频:https://www.bilibili.com/video/BV1NJ411E7tv?p=11
1.枚举因子法 判断是否为素数 时间复杂度
/*枚举因子法*/
bool judge(int n){
if(n==1) return false;
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}
2.普通素数筛法
//预处理n以内的素数
/* 素数筛法(1)
素数的倍数都进行删除
剩余的数均为素数
*/
const int N=1e7+1;
bool notprime[N];
void init(){
notprime[1]=1; //标记1不是素数
for(int i=2;i<N;i++){
if(notprime[i]==false){ //某个数为素数
for(int j=2*i;j<N;j+=i){
notprime[j]=true; //将此素数的所有倍数都删除
}
}
}
}
3.欧拉筛法(线性筛)
/*
(1)中像6,10 在循环过程中会被删除多次
欧拉筛 (线性筛)
*/
const int N=1e9+1;
bool notprime[N];
int prime[N],pn;//素数表
void init(){
pn=0; //初始化素数表为空
notprime[1]=1; //标记1不是素数
for(int i=2;i<N;i++){
if(notprime[i]==flase){
prime[pn++]=i; //加入素数表
}
for(int j=0;j<pn&&prime[j]*i<N;j++){ //枚举素数表
notprime[prime[j]*i]=true;
if(i%prime[j]==0) break;//如果遇到枚举的素数是i的约数,跳出循环
}
}
}