孪生素数问题
时间限制:3000 ms | 内存限制:65535 KB
难度:2
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离
为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读
题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14
样例输出
4
//筛法求孪生素数 #include<stdio.h> #include<math.h>//sqrt #include<string.h> bool visit[1000000];//prime[10000];//根据素数定理,实际没必要prime开成一百万 int main() { int i,j; long int m,n; int count=0; //c=0; int s;//标志变量,1为素数;或者用结构体数组 int temp; scanf("%d",&n); while(n--) { scanf("%d",&m); temp=(int)sqrt(m+0.5);//下面用到i*i memset(visit,0,sizeof(visit)); //visit[1]=1; for(i=2;i<=temp;i++)// if(!visit[i]) { //prime[c++]=i; for(j=i*i;j<=m;j+=i) //别误写为j++,不必从2*i开始,因为i=2时已经排除 visit[j]=1; } if(m==3)//距离为1的就这一种情况 count=1; else if(m>3) { for(i=1;i<=m-2;i++)//不是<=m,这要有等号,TMD竟然包括m ////i从1开始,不是0;因为前面已经有m==3的情况 { if(!visit[i]&&!visit[i+2]) count++; } count+1; } else count=0; printf("%d\n",count);//1既不是质数也不是合数,所以不能是count+1;况且已经忽略 //visit[0] count=0; //c=0; } return 0; }