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

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