51nod 1181质数中的质数(质数筛选法)
程序员文章站
2022-04-09 22:49:27
...
基准时间限制:1 秒空间限制:131072 KB分值: 0 难度:基础题
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
14
Output示例
31
17
埃拉托斯特尼筛法,也有人称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。
所使用的原理是从2开始,将每个素数的各个倍数,标记成
借用维基的图示
因为数据范围不大、才一百万,我们可以先把所有的质数筛选出来,然后再用一个函数,比较这个数与他在质数里面的位置是否均为质数。
Talk is cheap,show u the code.
#include<iostream>
#include<cstring>
using namespace std;
#define maxm 1000050
bool f[1000050]= {1},s[1000050];
void prime(bool e[]) //筛选质数
{
e[1] = false;
for (int i = 2; i <= maxm; i++)
{
if(e[i])
{
for(int j = i*2; j <= maxm; j+=i)
e[j] = false;
}
}
return;
}
void sp(bool e[], bool g[]) //筛选质数中的质数
{
int j = 1;
for(int i = 2; i <= maxm; i++)
{
if(e[i])
{
if(e[j])
{
g[i] = 1;
}
j++;
}
}
return;
}
int main()
{
for(int i = 1; i <= maxm; i++)
f[i] = true;
int n;
cin>>n;
prime(f);
sp(f,s);
for(int i = n; i <= maxm; i++)
if(s[i] == 1)
{
cout<<i<<endl;
return 0;
}
return 0;
}