51nod 1181 质数中的质数

题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
 
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
法一、筛出质数后再筛质数中的质数
#include<cstdio>
#include<algorithm>
#define N 1001001
using namespace std;
int n,prime[N],cnt;
bool v[N],g[N];
int main()
{
    for(int i=2;i<N;i++)
    {
        if(!v[i]) prime[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]*i>N-1) break;
            v[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    for(int i=1;i<=cnt;i++)
     g[prime[prime[i]]]=true;
    scanf("%d",&n);
    for(int i=n;i<N;i++)
     if(g[i]) 
     {
         printf("%d",i);
         return 0;
     }
}

法二、

#include<cstdio>
#include<algorithm>
#define N 1001001
using namespace std;
int n,prime[N],cnt;
bool v[N],g[N];
int main()
{
    for(int i=2;i<N;i++)
    {
        if(!v[i]) prime[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]*i>N-1) break;
            v[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    scanf("%d",&n);
    int pos;
    pos = upper_bound( prime, prime + cnt, n - 1 ) - prime;
    //第一个大于等于n的质数的编号,也就是自pos以后的质数,都满足题目>=n的要求 
    pos = upper_bound( prime, prime + cnt, pos-1 ) - prime;
    //所以要找>=pos的质数,最小的在哪一个位置 
    printf( "%d\n", prime[prime[pos]] );
}

 

posted @ 2017-03-30 09:52  TRTTG  阅读(243)  评论(0编辑  收藏  举报