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

Posted Draymonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\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 质数中的质数(质数筛法)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

51Nod - 1181 质数中的质数(质数筛法)

[51NOD1181]质数中的质数(质数筛法)(欧拉筛)

51nod 1181 质数中的质数