首页 > 其他 > 详细

51nod 1181 质数中的质数

时间:2017-03-30 10:52:00      阅读:141      评论:0      收藏:0      [点我收藏+]
题目来源: 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]] );
}

 

51nod 1181 质数中的质数

原文:http://www.cnblogs.com/TheRoadToTheGold/p/6644361.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!