nyoj 题目 孪生素数问题

孪生素数问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
 
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14
样例输出
4

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int prime[1000006];
 5 int flag[1000006];
 6 int ans[1000006];
 7 
 8 int getPrime() {
 9     int cnt = 0;
10     for(int i = 2; i <= 1000000; i++) {
11         if(flag[i] == 0) {
12             if(i != 2 && i - prime[cnt-1] <= 2) {
13                 ans[i] = ans[i-1]+1;
14             }
15             else {
16                 ans[i] = ans[i-1];
17             }
18             prime[cnt++] = i;
19             for(int p = 2*i; p <= 1000000; p+=i) {
20                 flag[p] = 1;
21             }
22         }
23         else {
24             ans[i] = ans[i-1];
25         }
26     }
27     return cnt;
28 }
29 int main(int argc, char const *argv[])
30 {
31     memset(flag, 0, sizeof(flag));
32     int n;
33     scanf("%d",&n);
34     ans[2] = 0;
35     int cnt = getPrime();
36     while(n--) {
37         int m;
38         scanf("%d",&m);
39         printf("%d\n",ans[m]);
40     }
41     return 0;
42 }

 

posted @ 2016-11-22 20:40  Jason杰  阅读(274)  评论(0编辑  收藏  举报