其他分享
首页 > 其他分享> > 素数筛法

素数筛法

作者:互联网

素数筛法

1.埃氏筛法

这个方法就是利用质数的倍数必然不是质数来解决的。然后每一次都会把这个质数后面所有的数都筛一遍

#include<iostream>
using namespace std;
const int N=1e8+100;
int n,prime[6000000],cnt,q;
bool isprime[N];
void judge(int n){
for(int i=2;i<=n;i++){//质数的筛选必然是从二开始的
if(!isprime[i]) prime[++cnt]=i;//如果没被筛掉的话,就肯定是一个质数啦
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
isprime[prime[j]*i]=1;//把所有质数prime[j]的倍数都筛掉
}
}
}
int main(){
cin>>n>>q;
judge(n);
for(int i=1;i<=q;i++){
int x;
cin>>x;
cout<<prime[x]<<endl;
}
return 0;
}

 

这个算法的时间复杂度肯定是非O(n),因为每个数都筛了不止一次,比如说21他就被3和7都筛了一次,这个的时间复杂度是O(nloglogn)

2.欧拉筛,线性筛

这个的时间复杂度就是O(n)的,因为他保证了每个数只被筛选一次。代码和上面差不多。

#include<iostream>
using namespace std;
const int N=1e8+100;
int n,prime[6000000],cnt,q;
bool isprime[N];
void judge(int n){
for(int i=2;i<=n;i++){
if(!isprime[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
isprime[prime[j]*i]=1;
if(i%prime[j]==0) break;//这一步是与上面的唯一区别,保证了prime[j]是被筛数的最小质因子,具体证明,博主数学太菜,建议再去找一下其他资料。
}
}
}
int main(){
cin>>n>>q;
judge(n);
for(int i=1;i<=q;i++){
int x;
cin>>x;
cout<<prime[x]<<endl;
}
return 0;
}
 

 

 

标签:prime,cnt,筛法,int,质数,素数,judge,isprime
来源: https://www.cnblogs.com/silky----player/p/16519252.html