孪生素数问题
时间限制:
3000
ms | 内存限制:
65535
KB
难度:
3
-
描述
-
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
-
输入
-
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
- 每组测试数据输出占一行,该行为m范围内所有孪生素数组数。 样例输入
-
1 14
样例输出
-
4
来源
- [hzyqazasdf]原创
- 思路:
- 当看到这道题我的第一感觉是直接求不就好了吗.于是我就写了这样的超时程序,看到超时我才注意到题目中给的数据范围是1000000,而且测试数据有100个,可以很直观的看到我的第一个程序对于每次的m以内的数总是在重复的求着.那我何不从1开始直到1000000循环一遍,每次m增加1,把m以内的孪生素数放到以m为下标的数组中呢,试了一下,结果对了.
- 超时程序代码:
-
#include <iostream> #include <cstdio> 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 T; scanf("%d", &T); while(T--) { int m, sum = 0; scanf("%d", &m); if(m < 3) printf("%d\n", sum); else { for(int i = 2; i <= m; i++) { if(i == m-1) { if(is_prime(i) && is_prime(i+1)) sum++; break; } else { if(is_prime(i) && is_prime(i+1)) sum++; if(is_prime(i) && is_prime(i+2)) sum++; } } } printf("%d\n", sum); } return 0; }
通过代码:
-
#include <iostream> #include <cstdio> 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 a[1000001]; //定义数组用开存放数m的结果,数组的下标即代表着m int main() { a[0] = 0;//当m为1,2时结果都为零 a[1] = 0; a[2] = 0; a[3] = 1; int sum = 1;//存放数m以内的孪生数结果,然后赋值给下标为m的变量a[m] for(int i = 4; i <= 1000000; i++) { if(is_prime(i) && is_prime(i-1))//相距为1的情况 sum++; if(is_prime(i) && is_prime(i-2))//相距为2的情况 sum++; a[i] = sum; } int T; cin >> T; //T组测试数据 while(T--) { int m; //数m scanf("%d", &m); printf("%d\n", a[m]); } return 0; }
-
第一行给出N(0<N<100)表示测试数据组数。