PAT 1013 数素数 (20)
题目
/*
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是一个较大数测试,其他都是小数目,因此如果无法给出较好的大数处理方案可以做小数处理取得部分分数。