如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
代码:(没用指数筛法)
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
int num=0;
int flag;
for(int i=2;i<n;i++)
{
flag=0;
for(int j=2;j<=(int)sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
num++;
}
for(int i=n;;i++)
{
flag=0;
for(int j=2;j<=(int)sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
num++;
if(num==1)
continue;
flag=0;
for(int j=2;j<=(int)sqrt(num);j++)
{
if(num%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
cout<<i<<endl;
break;
}
}
}
return 0;
}
拓展:指数筛法(与此题无关)
求100000以内质数
#include"cstdio"
#include"cstring"
using namespace std;
#define MAX 100000//求MAX范围内的素数
long long su[MAX],cnt;
bool isprime[MAX];
void prime()
{
cnt=1;
memset(isprime,1,sizeof(isprime));//初始化认为所有数都为素数
isprime[0]=isprime[1]=0;//0和1不是素数
for(long long i=2;i<=MAX;i++)
{
if(isprime[i])
su[cnt++]=i;//保存素数i
for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
{
isprime[su[j]*i]=0;//筛掉小于等于i的素数和i的积构成的合数
}
}
}
int main()
{
prime();
for(long long i=1;i<cnt;i++)
printf("%d ",su[i]);
return 0;
}