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 质数中的质数(质数筛法)的主要内容,如果未能解决你的问题,请参考以下文章