PAT1013數素數C++

zhuzizhuzhu發表於2021-01-05

PAT1013數素數
題目:
1013 數素數 (20分)
令 P​i 表示第 i 個素數。現任給兩個正整數 M≤N≤10​000,請輸出 PM到 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
程式碼:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	int M,N;
	cin>>M>>N;
	int a[10000];    //儲存素數值,陣列下標代表了是第幾個素數
	int k=0,m=0;
	int flag;
	int i=2;
	a[0]=2;      //指明第一個素數
	while(k<=N) 
	{
		flag=0;
		for(int j=2;j<=sqrt(double(i));j++)    //1.sqrt()裡面是double型 的數,但i是int型的,要轉化一下
		                                       //2.若直接用j<i,第四個測試點會執行超時。
		{
			if(i%j==0)
			{
				flag=1;
				break;
			}
		}
		if(flag==0)
		{
			k++;
			a[k]=i;
		}
		i++;
	}
	for(int i=M;i<N;i++)
	{
		cout<<a[i];
		m++;
		if(m%10==0)     //設定輸出格式
			cout<<endl;
		else
			cout<<' ';
	}
	cout<<a[N];
	system("pause");
	return 0;
}

注意:

  1. 最開始,我用的是一個for迴圈來限制值,這樣不好確定 i 的範圍。網上查了一下第10000個素數大概是10500左右,但這樣每次都要計算出10000個素數,不太方便。也可能會產生執行超時,第四個測試點通不過的問題。後來選用一個while迴圈,改善了一下。
    for(int i=0;i<10500;i++)
    {
    }
  2. 最開始在判斷一個數 i 是否為素數時,我採用的是用 i 除以 從2到i-1的所有數,看看餘數是否為0;這樣會導致執行超時,第四個測試點通不過,改善了一下,用 i 除以從2 到sqrt(i) 的所有數,這可能是這道題要考察的點,要學會適當優化程式。

相關文章