质数中的质数
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
如果一个质数,它在质数中的编号也是质数,就称为质数中的质数。
例如3是一个排在第2位质数,所以3是质数中的质数,虽然7是一个质数,但7排在第4位,所以7不是质数中的质数
给你一个数n,求出 >=n 的一个最小的质数中的质数
输入
输入一个数n(0<=n <= 10^6)
输出
输出>=n的最小的质数中的质数
示例输入
2 3 4
示例输出
3 3 5
提示
来源
示例程序
#include<bits/stdc++.h>
using namespace std;
const long long M=1100001;
int a[M],b[M],c[M];
int main()
{
int i,n,j;
memset(a,0,sizeof(a));
for (i=2;i<=M/2;i++)
{
if (!a[i])
{
for (j=2*i;j<M;j+=i)
a[j]=1;
}
} //筛法求素数,下标为质数则a[i]=0 else a[i]=1
a[0]=a[1]=1;
j=0;
for (int i=2;i<M;i++)
{
if (!a[i])
b[j++]=i; //将筛得的质数保存在 b数组中
}
int k=0;
for (int i=0;i<j;i++)
{
if (!a[i+1])
{
c[k++]=b[i]; // 筛出质数中的质数保存在c数组中
}
}
while (cin>>n)
{
if (n==1||n==0)
cout<<2<<endl; //声明当输入1or0时第一个质数中的质数为2,否则会WA,但实际上我个人认为这是错误的,坑啊!
else
{
int *t=find(c,c+k,n); //find函数用于返回数组中第一个等于n的值的地址else返回数组最后一个值的下一位的地址即c+k
if (t!=c+k)
cout<<*t<<endl;
else
{
cout<<*upper_bound(c,c+k,n)<<endl;//upper_bound函数用于返回第一个>n的值的地址
}
}
}
return 0;
}