1181 质数中的质数(质数筛法)

来源:互联网 发布:派派交友软件 编辑:程序博客网 时间:2024/06/07 03:37

1181 质数中的质数(质数筛法)
题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=1000006;int p=1,k=0;//因为素数表从1开始int prime[maxn];bool is_prime[maxn];int ans[maxn];void sieve()//素数筛{    for(int i=2;i<maxn;i++)        is_prime[i]=1;    for(int i=2;i<maxn;i++)    {        if(is_prime[i])        {            for(int j=2*i;j<maxn;j+=i)                is_prime[j]=0;        }    }}void init()//处理素数{    for(int i=2;i<maxn;i++)        if(is_prime[i])            prime[p++]=i;}void init2()//处理素数中的素数{    for(int i=2;i<=p;i++)        if(is_prime[i])            ans[k++]=prime[i];}int main(){    int n;    cin>>n;    sieve();    init();    init2();    int pos=lower_bound(ans+1,ans+k+1,n)-ans;//二分查找>=N的答案,    //函数lower_bound()在first和last中的前闭后开区间进行二分查找,    //返回大于或等于val的第一个元素位置。    printf("%d\n",ans[pos]);    return 0;}