PAT乙级-1013


PAT乙级-1013


题目分析

 题目要求给定两个正整数mnm<n,输出第m个素数到第n个素数之间的所有素数(包含第m个素数和第n个素数)。

 核心算法还是素数的判断,这在之前已经涉及到了,采用根号法降低时间复杂度。每十个数一行,数字间以空格隔开且行末无空格,只需使用一个布尔型变量和一个计数器就能解决。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "iostream"
using namespace std;

bool is_prime(int n){
for(int i=2; i*i<=n; ++i){
if(n%i == 0)
return false;
}
return true;
}

int main(){
int m, n;
cin >> m >> n;
int num = 1, cnt = 0, col = 0;
// num用于循环遍历所有正整数以判断素数;cnt用于计数当前是第几个素数;col用于每个十个数字换行
bool first = true;
while(cnt <= n){
if(is_prime(++num)){
if((++cnt >= m) && (cnt <= n)){
if(first){
cout << num;
first = false;
}else
cout << " " << num;
if(++col%10 == 0){
cout << endl;
first = true;
}
}
}
}
return 0;
}

踩坑指南

 最外层循环刚开始使用的是for循环,这就需要一个最大边界值。我采用10005作为边界值,这里错误的点在于第10000个素数其实是远大于数值10005的,因此提交后有一组数据始终未通过。为了将题目中给定的范围10000包含在内,我将边界值扩大十倍以达到数值要求,同时带来的负面效果也是显然的——时间超出。最终我选定n作为循环边界,改用while语句完成循环才得以通过判题。


转载 请注明来源:©Tinshine