51nod:1181 質數中的質數(質數篩法)

題目來源: Sgu
基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題
 收藏
 關注
如果一個質數,在質數列表中的編號也是質數,那麼就稱之爲質數中的質數。例如:3 5分別是排第2和第3的質數,所以他們是質數中的質數。現在給出一個數N,求>=N的最小的質數中的質數是多少(可以考慮用質數篩法來做)。
Input
輸入一個數N(N <= 10^6)
Output
輸出>=N的最小的質數中的質數。
Input示例
20
Output示例
31

這麼簡單個題,我測試也對着,不知道啥問題,一直wa,先把代碼貼上吧,有大神的話歡迎指出錯誤!!

#include <cstdio>
#include <vector>
#include <iostream> 
using namespace std;
int p[1010000];
void dabiao()
{
	p[0]=1;
	p[1]=1;
	for(int i=2;i<1010000;i++)
	{
		if(p[i]==1)
		{
			continue;
		}
		for(int j=i*2;j<1010000;j=j+i)
		{
			p[j]=1;
		}
	}
}
int main()
{
	dabiao();
	int n;
	vector<int> v1,v2;//v1存質數,v2存質數中的質數 
	v1.clear();
	v2.clear();
	for(int i=n;i<1010000;i++)
	{
		if(p[i]==0)
		{
			v1.push_back(i);
		}
	}
	vector<int>:: iterator it;
	for(it=v1.begin();it!=v1.end();it++)
	{
		int pos=it-v1.begin()+1;//找到質數的位置 
		if(p[pos]==0)//看質數所在的位置是否是質數 
		{
			int x=*it;
			v2.push_back(x);
		}
	}
	scanf("%d",&n);
	for(it=v2.begin();it!=v2.end();it++)//這是順序查找 
	{
		int x=*it; 
		if(x>=n)
		{
			printf("%d\n",x);
			break;
		}
	}
	/*int pp=lower_bound(v2.begin(),v2.end(),n)-v2.begin();//這樣用二分找也行 
	printf("%d\n",v2[pp]); */
	return 0;
 } 

今天用辣雞寫法寫了一下,依然沒找出上面的問題所在

#include <cstdio>
#include <vector>
#include <iostream> 
using namespace std;
int p[1010000];
void dabiao()
{
	p[0]=1;
	p[1]=1;
	for(int i=2;i<1010000;i++)
	{
		if(p[i]==1)
		{
			continue;
		}
		for(int j=i*2;j<1010000;j=j+i)
		{
			p[j]=1;
		}
	}
}
int main()
{
	dabiao();
	int n;
	int cnt=0;
	scanf("%d",&n);
	for(int i=0;i<1010000;i++)
	{
	    if(p[i]==0)
	    {
	        cnt++;
	        if(i>=n&&p[cnt]==0)
	        {
	            printf("%d\n",i);
	            break;
	        }
	    }
	}
	return 0;
 }


發佈了277 篇原創文章 · 獲贊 20 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章