欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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开始,将每个素数的各个倍数,标记成

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

借用维基的图示

因为数据范围不大、才一百万,我们可以先把所有的质数筛选出来,然后再用一个函数,比较这个数与他在质数里面的位置是否均为质数。

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;
}

相关标签: 质数筛选