题解
2025-02-09 22:19:20
发布于:江苏
20阅读
0回复
0点赞
当然可以将每个数依次进行判断,得出质数表,这里讲一种比较高效的算法:埃氏筛法。将 到 之间的整数存在一个 bool 数组中,先全部标记为 true,从 开始,把 的倍数全部标记为 false,再往下循环,发现下一个质数是 ,再把 的倍数全部标记为 false,再往下循环,发现下一个质数是 ,再把 的倍数全部标记为 false,以此类推,便能把范围内的质数筛出来,过程中把质数存在数组中,便能得到第 个质数。
经计算,第 个质数在 以内,只要把 以内的质数筛出来即可。
时间复杂度是一个常数,数量级为 。
代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool ip[20005];
vector<int>prm;//存储质数
void f(int n)//埃氏筛函数,筛出n以内的质数
{
ip[0]=ip[1]=0;
for(int i=2;i<=n;i++)ip[i]=1;
for(int i=2;i<=n;i++)
{
if(ip[i])
{
prm.push_back(i);
if(i*i>n)continue;
for(int j=i*i;j<=n;j+=i)ip[j]=0;
}
}
return ;
}
signed main()
{
f(20000);
int n;cin>>n;
cout<<prm[n-1];//因为vector的下标从0开始,所以应该访问prm[n-1]
return 0;
}
这里空空如也
有帮助,赞一个