1013 数素数 (20 分)
题目:1013 数素数 (20 分)
令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤104,请输出 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
思路:
- 只要在预处理中运用素数筛存储好前1w个素数就好了,按要求的格式输出即可。但是要注意前10w个数中没有1w个素数,所以要把数尽量开大,不然测试点4会过不了。测试点4就是要输出到1w个素数的。总之,是输出素数中排在9k多到1w之间的素数,开太小了,后面这些数就没存储上,就错了。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <sstream> 5 #include <cmath> 6 #include <algorithm> 7 #include <string> 8 #include <stack> 9 #include <queue> 10 #include <vector> 11 #include <map> 12 using namespace std; 13 14 int su[100005]; 15 int prime[1000005]; 16 17 void isprime() //判断是否是素数 18 { 19 memset(prime, 1, sizeof(prime)); 20 prime[0] = prime[1] = 0; 21 int cnt = 1; 22 for(int i = 2; i <= 1000005; i++) 23 { 24 if(prime[i]) //如果是素数 25 su[cnt++] = i; 26 for(int j = 2 * i; j <= 1000005; j += i) 27 prime[j] = 0; //素数的倍数是合数 28 } 29 } 30 31 int main() 32 { 33 int n, m; 34 isprime(); 35 scanf("%d%d", &n, &m); 36 int cnt = 1; 37 for(int i = n; i <= m; i++) 38 { 39 if(cnt % 10 == 0 && cnt != 1) 40 printf("%d\n", su[i]); 41 else if(i == m) 42 printf("%d", su[i]); 43 else 44 printf("%d ", su[i]); 45 cnt++; 46 } 47 return 0; 48 }
总结:
刚开始测试点4没过,感觉自己的代码没啥大问题,就一个点没过猜测是没有存够1w个素数,于是选择试着输出排在后面的素数看结果,发现果然是没存够,开到在100w起步的数中存素数后就没问题了。