关于孪生素数,各位帮忙看一下代码本身有没有逻辑错误。
程序代码:
#include <stdio.h> #include <math.h> int judge(int t) { int i,flag=1; for(i=2;i<=sqrt(1.0*t);i++) if(t%i==0) { flag=0; break; } return (flag); } int main() { int n,m,i ,co=2,a[10000],b[10000],j=0; for(i=6;i<1000000;i+=6) //记录100W之前的所有孪生素数有多少对 if(judge(i+1)&&judge(i-1)) { co++; a[j]=co; //记录孪生素数有所少对 b[j]=i+1;//记录比此孪生素数大一的数,以后查找谁之前的孪生素数号好查询 j++; } scanf("%d",&n);//有N组查询数据 while(n--) { scanf("%d",&m);//查询0到M范围内所有的孪生素数对 if(m>=1&&m<3) co=0; if(m>=3&&m<=4) co=1; if(m>4&&m<=6) co=2; for(i=0;i<10000;i++)//判断此数在哪两个孪生素数对之间 if(m>=b[i]&&m<b[i+1]) { co=a[i]; break; } printf("%d\n",co);//输出0到M孪生素数对的数目 } return 0; }有人有可能问为什么在判断孪生素数对是每次都是加6呢,在这里解释一下,我们想一下3的倍数有什么特征。任给三个连续的自然数(0除外)必有一个是3的倍数。我们以6 7 8三个数为例来说。7的左边是3的倍数所以7的两侧不可能存在孪生素数,而8的右侧又是3的倍数,所以孪生素数一定存在在3的倍数的两侧;然而3的奇数倍的数一定是奇数,奇数的两侧一定偶数,所以3的奇数倍两侧不可能是素数,所以孪生素数一定存在在3的偶数倍的两侧。于是我就每次加6。(再加上一句距离是一的也设为孪生素数)。但是OJ提交错误,各位帮帮忙。