直接求出0到1000000之间的质数中的质数。

#include<iostream> 
#include<algorithm>
#include<cmath>
using namespace std;
int t[1000000],ans[1000000];
int zhishu(int a)
{
if(a==1)
return 0;
for(int i=2;i<=sqrt(a);i++)
if(a%i==0)
return 0;
return 1;
}
int main()
{
int a,i,j,k;
cin>>a;
for(i=2,j=0;i<1000010;i++)
if(zhishu(i))
t[j++]=i;
for(i=0,k=0;i<j;i++)
if(zhishu(i+1))
ans[k++]=t[i];
for(i=0;i<k;i++)
if(ans[i]>=a)
break;
cout<<ans[i]<<endl;
return 0;
}

不过还是用质数筛法更快,用时少。

质数筛法的思路就是从2开始到某一范围,将i的倍数(不是质数)标记。还是看代码比较容易理解!

#include<iostream>
using namespace std;
typedef long long ll;
const int Maxn=1000010;
ll prim[Maxn]={0};
int main()
{
ll n,cnt=0;
cin>>n;
prim[1]=1;//0表示质数
for(ll i=2;i<Maxn;i++)
{
if(!prim[i])//如果i是质数
{
cnt++;//质数的下标
if(!prim[cnt]&&i>=n)//质数中的质数
{
cout<<i<<endl;
break;
}
}
for(ll j=i*i;j<Maxn;j+=i)
prim[j]=1;
}
return 0;
}