1013 數素數 (20分)/c++實現

進擊の小浩發表於2020-10-07

令 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

思路:
1、建立一個大小為max動態陣列來接受素數,因為第10000個素數是104729,在遍歷尋找判斷素數需要大於104729。
2、是用容器來寫,思路同上,容器的方法我覺得更加精簡。

動態陣列程式碼:

#include<iostream>
#include<cmath>
using namespace std;
bool isprime(int a)
{
	bool flag = true;
	for (int j = 2; j <=sqrt(a); j++)
	{
		if (a % j == 0) //判斷a不是素數
		{
			flag = false;
			break;
		}	
	}
	return flag;
}
int main()
{
	int min, max, count = 1, count1 = 1,count2=1;
	cin >> min >> max;
	int* pd = new int[max];
	pd[0] = 1;
	for (int i = 2; i <=105000; i++)
	{
		if (isprime(i))
		{
			if (count<=max)
			{
				pd[count] = i;
				count++;
			}
		}
	}
	for (int i =min; i <=max; i++)
	{
		cout << pd[i];
		if (count1 % 10 != 0 && count2<(max-min+1))
		{
			cout << " ";
		}
		else
			cout << endl;
		count1++;
		count2++;
	}
	delete []pd;
	return 0;
}

容器程式碼:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
bool isPrime(int a)//判斷是否為素數
{
	bool flag = 1;
	for (int i = 2; i <= sqrt(a); i++){
		if (a % i == 0){
			flag = 0;
			return flag;
		}
	}
	return flag;
}
int main()
{
	int min, max;
	cin >> min >> max;
	vector<int>v;
	for (int i = 1; i < 105000; i++){//第10000個素數是104729
		if(isPrime(i))
			v.push_back(i);//如果是素數,就插入到容器中
		if (v.size() == max+1)//如果達到了題目要求的最大素數數目+1(因為1不是素數,所以會佔一個位置為v[0])停止迴圈
			break;
	}
	for (int i = min; i < v.size(); i++){
		cout << v[i];
		if ((i - min+1) % 10 != 0 && i != max)//每整除10換行,不到10輸出空格,i!=max保證輸出最後一個數後面沒有空格
			cout << " ";
		else
			cout << endl;
	}
	return 0;
}

在這裡插入圖片描述

相關文章