PAT乙级-1013
题目分析
题目要求给定两个正整数m
、n
且m
<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;
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