关于孪生素数,各位帮忙看一下代码本身有没有逻辑错误。
程序代码:#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提交错误,各位帮帮忙。









