首页 > 代码库 > 51NOD 1181 质数中的质数(质数筛法)

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

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("\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;}

 

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