題目
/*
1013. 數素數 (20)
令Pi表示第i個素數。現任給兩個正整數M <= N <= 10^4,請輸出PM到PN的所有素數。
輸入格式:
輸入在一行中給出M和N,其間以空格分隔。
輸出格式:
輸出從PM到PN的所有素數,每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
*/
思路
// 先得到前1000個素數
// 再根據輸入進行輸出
代碼
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define NUM 10004
int primes[NUM];
void findPrimes(){
//如果不能被任何一個質數整除,那就是質數
int cnt=0;// 第cnt個質數,從1開始計數
int a = 2;// 從2開始的自然數 a
while (cnt <= NUM) {
// 優化1:排除偶數
if (a % 2 == 0 && a != 2) {
++a;
continue;
}
int i = 0;
// 優化2:不超過第cnt個質數的開方數
for (i = 0; i < sqrt(cnt); ++i) {
if (a % primes[i] == 0) {
break;
}
}
if (i >= sqrt(cnt)) {
primes[cnt] = a;
cnt++;
}
++a;
}
}
int main(){
// 預處理
findPrimes();
// 輸入數據
int m,n;
cin >> m >> n;
// 按格式輸出
for(int i = m; i <= n; ++i){
cout << primes[i-1];
if ((i-m+1) % 10 == 0 || i == n) {
// cout << endl;
printf("\n");
}else{
// cout << ' ';
printf(" ");
}
}
}
過程資料
測試點:
- 共7個測試點,測試點4是一個較大數測試,其他都是小數目,因此如果無法給出較好的大數處理方案可以做小數處理取得部分分數。