一、埃氏筛
- 定义
埃氏筛存在重复筛的情况,如30会被2(*15)、3(*10)和5(*6)筛三次。如何更快速地筛出一定上限内的素数?下面这种方法(欧拉筛)可以保证范围内的每个合数都被删掉(在 bool 数组里面标记为非素数),而且任一合数只被:“最小质因数 × 最大因数(非自己) = 这个合数”的途径删掉。由于每个数只被筛一次,时间复杂度为O(n)。
原文链接:https://blog.csdn.net/u014042772/article/details/121587507
![](https://img-blog.csdnimg.cn/img_convert/c25585493b4a43b9181c62837f65a120.png)
原文链接:https://blog.csdn.net/YSJ367635984/article/details/108929586
2.模板
#include<bits/stdc++.h>
using namespace std;
bool isprime[10005];
int main(){
int i,j,n;
memset(isprime,true,sizeof(isprime));
cin>>n;
isprime[0]=isprime[1]=false;
for(i=2;i<=sqrt(n);i++){
if(isprime[i]){
for(j=2;i*j<=n;j++)
isprime[i*j]=false;
}
}
for(i=2;i<=n;i++)
if(isprime[i])
cout<<i<<endl;
return 0;
}
二、欧拉筛(线性筛)
- 定义
每个合数均存在最小质因子
- 怎么实现
- 模板
#include<bits/stdc++.h>
using namespace std;
bool isprime[10005];
int prime[10005];
int main(){
int i,j,n,k=0,t;
memset(isprime,true,sizeof(isprime));
cin>>n;
isprime[0]=isprime[1]=false;
for(i=2;i<=n;i++){
if(isprime[i])
prime[k++]=i;
for(j=0;j<k;j++){
t=i*prime[j];
if(t>n)
break;
isprime[t]=false;
if(i%prime[j]==0)
break;
}
}
for(i=2;i<=n;i++)
if(isprime[i])
cout<<i<<endl;
return 0;
}