1013 数素数 (20 分)

题目:1013 数素数 (20 分)

Pi​​ 表示第 i 个素数。现任给两个正整数 MN104​​,请输出 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起步的数中存素数后就没问题了。

 

posted @ 2019-07-23 20:24  Anzer  阅读(513)  评论(1编辑  收藏  举报