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

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如: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("
");*/

}
int main ()
{
    scanf("%d",&n);
    solve();
    for(int i=n;i<=1e6;i++){
        if( s[i] )
        {
            printf("%d
",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
",i);
                    break;
            }
            cnt++;

            for(ll j=i*i;j <= 1e6;j+=i)
            {
                s[j] = 1;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Draymonder/p/7345310.html