求教,关于筛法求素数C
题目:处于相邻的两个素数p和p + n之间的n - 1个连续的合数所组成的序列我们将其称为 长度为n的素数槽。例如,< 24, 25, 26, 27, 28 >是处于素数23和素数29之间的一 个长度为6的素数槽。写一个程序来计算包含整数k的素数槽的长度。如果k本身就 是素数,那么认为包含k的素数槽的长度为0。
Input
第一行是一个数字n,表示需要测试的数据的个数。后面有n行,每行是一个正整数k , k大于1并且小于或等于的第十万个素数(也就是1299709)。
Output
对于输入部分输入的每一个k,都对应输出一个非负整数,表示包含k的素数槽的长 度,每个非负整数占一行。
Sample Input
5
10
11
27
2
492170
Sample Output
4
0
6
0
114
附注:此题目时间限制是2秒,所以想到用筛法。
我的错误的代码,求高人看看错在哪
#include<stdio.h>
#include<math.h>
int a[1299710]; //这个程序不用筛法估计要十秒,但是用筛法了反而跑不出来,求高人指点
int main()
{ __int64 m=2,n,s,k,i,j,max,min,bb;
a[0]=a[1]=1;
for(m=2;m<1299710;m++)
{ if(!a[m])//当a【0】没有被标记,执行下面语句
{for(j=2;j<=sqrt(m);j++)
if(m%j==0)
break;
if(j>sqrt(m))
{ a[m]=0;
i=m;
bb=m*i;
for(;bb<1299710;i++)
{ bb=m*i;
a[bb]=1;}//如果是素数就标记为零,把素数的倍数标记为1
}
}
} //筛法部分
//for(i=0;i<50;i++)
// printf("*%d*",a[i]);
scanf("%I64d",&n);
while(n--)
{
scanf("%I64d",&k);
s=k;
if(!a[k])
printf("0\n");
if(a[k])
{
while(a[s]&&s>1)
s--;
min=s;
while(a[k]&&k<1299710)
k++;
max=k;
printf("%I64d\n",max-min);
}
}
return 0;
}