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


基准时间限制: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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章