如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Sample Input
20
Sample Output
31
还是打表。我先把素数的表存放在数组a,然后再用数组b记录素数的次序。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[1000000+10]={0};
int b[1000000+10];
void P()
{
int cas=1;
for(int i=2;i<=1000000+10;i++)
{
if(a[i]==0)
{
for(int j=2;i*j<=1000000+10;j++)
{
a[i*j]=1;
}
}
}
for(int i=2;i<=1000000+10;i++)
{
if(a[i]==0)
{
b[i]=cas++;
}
else
{
b[i]=cas;
}
}
//printf("%d\n",a[9]);//这是当时调试的痕迹,这种方式是一种很直观的调试方法,推荐使用。
}
int main()
{
P();
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=n;;i++)
{
if(a[i]==0&&a[b[i]]==0)
{
// printf("%d %d!!!\n",a[i],b[a[i]]);
printf("%d\n",i);
break;
}
}
}
return 0;
}