【PAT】B1013 數素數 (20分)

1013 數素數 (20分)

題目鏈接

在這裏插入圖片描述


今天最重要的不是這道題,而是今天是2020.02.29,你發現了嗎?四年一遇啊!!!趕緊記錄一下,哈哈。

不知道你看到這篇文章的時候是在哪一年的哪一月哪一日呢?


言歸正傳,這道題兩種方法來做,第一種方法是常規方法,第二種方法是“素數篩法”。

法一:

#include<iostream>
#include<cmath>
using namespace std;
int isSuShu[500000]; 
int main()
{
	//freopen("in.txt","r", stdin);
	int counts=1,j,i=2;
	while(1)
	{
		int k = (int)sqrt((double)i);
		for(j=2;j<=k;j++)
			if(i%j == 0)
				break;
		if(j>k)
			isSuShu[counts++] = i;
		if(counts>10000)
			break;
		i++;
	}
	int m,n;
	cin>>m>>n;
	for(int i=m;i<=n;i++)
	{
		cout<<isSuShu[i];
		if((i-m+1)%10 == 0)
			cout<<endl;
		else if(i!=n)
			cout<<" ";
	}
	return 0;
}

缺點:運行時間較長,時間複雜度高。
在這裏插入圖片描述
法二:

#include<iostream>
using namespace std;

#define maxn 104730  //首先打標得出第10000個素數的大小是104729

int prime[maxn], pnum=1;
bool p[maxn] = {0};//false爲素數,true爲合數 

void find_Prime()
{
	for(int i=2;i<maxn;i++)
	{
		if(!p[i]){
			prime[pnum++] = i;
			for(int j=i+i;j<maxn;j+=i)
				p[j] = true;
		}
	}
}

int main()
{
	find_Prime();
//	cout<<prime[10000]<<endl;//104729
	int m,n;
	cin>>m>>n;
	int flag=0;
	for(int i=m;i<=n;i++)
	{
		cout<<prime[i];
		flag++;
		if(flag % 10 == 0)
			cout<<endl;
		else if(i!=n)
			cout<<" ";
	}
	return 0;
}

在這裏插入圖片描述

在這裏插入圖片描述

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