代码均经过测试ac
朴素筛---->埃氏筛--->欧拉筛(洛谷3383)
进阶 进阶
朴素筛(判断一个数是否是素数):
//时间复杂度O(n√n)
bool fun(int n){
if(n<=1) return false;
if(n==2) return true;
for(int i=2;i*i<=n;i++){
if(n%i==0){
return false;
}
}
return true;
}
埃氏筛法:
埃氏筛和欧拉筛最后结果都是将一个范围的所有素数存到prime数组中,但是欧拉筛的复杂度比埃氏筛的复杂度低,效率更高,因为欧拉筛没有重复筛选,而埃氏筛有重复筛选
//核心:删除每个素数的倍数
//时间复杂度O(nlogn)
const int N=1e6+10;
int prime[N];
bool vis[N];
int k=0;
int n;
void fun(){
for(int i=2;i<=n;i++){
if(!vis[i])prime[++k]=i;
for(int j=2*i;j<=n;j+=i){
vis[j]=1;
}
}
}
欧拉筛法:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sum=0;
int prime[10000000];
int k=0;
bool vis[100000];
ll n;
void fun(){
//欧拉筛的核心是 每个合数只被最小的质因数筛掉
//复杂度O(n)
for(int i=2;i<n;i++){
if(!vis[i])prime[k++]=i;
for(auto p:prime){
if(p*i>n)break;
else vis[p*i]=1;
if(i%p==0)break;//避免重复筛选
}
}
}
int main(){
cin>>n;
fun();
cout<<prime[0];//求第1个素数
return 0;
}