ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

素数筛法

2022-07-25 23:34:50  阅读:156  来源: 互联网

标签:prime cnt 筛法 int 质数 素数 judge isprime


素数筛法

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有