1. 程式人生 > >PAT 乙級 1013 數素數

PAT 乙級 1013 數素數

1013 數素數 (20 point(s))

令 P​i​​ 表示第 i 個素數。現任給兩個正整數 M≤N≤10​4​​,請輸出 P​M​​ 到 P​N​​ 的所有素數。

輸入格式:

輸入在一行中給出 M 和 N,其間以空格分隔。

輸出格式:

輸出從 P​M​​ 到 P​N​​ 的所有素數,每 10 個數字佔 1 行,其間以空格分隔,但行末不得有多餘空格。

輸入樣例:

5 27

輸出樣例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

經驗總結:

這一題,肯定還是要用埃氏篩法的, 就是需要控制一下,當素數數量大於10000就終止就行了,就是空間要稍微開大一點(因為沒有測試第10000個素數到底有多大= =),然後再控制一下輸出一行頂多10個,如果小於10個最後一個數也不能有多餘的空格,就這些啦~╭( ̄▽ ̄)╯

AC程式碼

#include <cstdio>
const int maxn=1000010;
int prime[10010];
bool flag[maxn]={false};
int pnum=0;
void find_prime(int n)
{
	for(int i=2;i<maxn&&pnum<n;++i)
	{
		if(flag[i]==0)
		{
			prime[pnum++]=i;
			for(int j=i+i;j<maxn;j+=i)
			{
				flag[j]=1;
			}
		}
	}
}
int main()
{
	int m,n;
	find_prime(10010);
	while(~scanf("%d %d",&m,&n))
	{
		int count=1;
		for(int i=m;i<=n;++i)
		{
			if(count!=1&&count%10==0||i==n)
				printf("%d\n",prime[i-1]);
			else
				printf("%d ",prime[i-1]);
			++count;
		}
	}
	return 0;
}