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

本文介绍了一种寻找“质数中的质数”的算法实现,即那些在质数列表中位置也是质数的质数。文章提供了两种使用质数筛法的C++实现方式,并详细解释了如何求出大于等于给定数值N的最小质数中的质数。
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
 
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。


自己写的模拟版本
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e7;
bool s[maxn];
bool p[maxn];
int n;
void solve ()
{
    for(int i=1;i <= 1e6+10 ;i++) s[i] = 1;
    s[1] = 0;
    for(int i=2;i*i <= 1e6;i++){
        if( s[i] ){
            for(int j= i*i; j <= 1e6;j+=i ){
                s[j] = 0;
            }
        }
    }


    int cnt = 1;
    for(int i=1;i <= 1e6;i++) p[i] = s[i];
    for(int i=1;i <= 1e6;i++){
        if(s[i]){
            if(p[cnt] == 0)
                s[i] = 0;
            cnt++;
        }
    }
    /*for(int i=1;i <= 100;i++)
        printf("%d ",s[i]);
    printf("\n");*/

}
int main ()
{
    scanf("%d",&n);
    solve();
    for(int i=n;i<=1e6;i++){
        if( s[i] )
        {
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}

然后  网上搜索到一个比较好的方法 

就是  把不是素数的都标记好  

(注意以后素数打表的时候  还是要用long long 否则会爆int的

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+1000;
typedef long long ll;
bool s[maxn];
int n;

int main (){
    //freopen("out.txt","w",stdout);
    scanf("%d",&n);
    int cnt = 1;
    s[1] = 1,s[2] = 0;
    for(ll i=2;i <= 1e6+500;i++)
    {
        if(!s[i])
        {
            if(!s[cnt] && i >= n)
            {
                    printf("%d\n",i);
                    break;
            }
            cnt++;

            for(ll j=i*i;j <= 1e6;j+=i)
            {
                s[j] = 1;
            }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值