这是来自名为prime1的spoj的问题。代码似乎对我来说是正确的。这甚至运行并在ideone.com上产生了理想的结果,但是spoj给了我一个运行时错误,说这是一个分段错误。我找不到任何内存泄漏,没有缓冲区溢出等。请帮我找到分段错误。
#include <stdio.h>
unsigned int arr[32200];
int prime()
{
unsigned int i,j,k=2;
int flag;
arr[0]=2;
arr[1]=3;
for (i=5;i<32200;i+=2)
{
flag=0;
for(j=3;j<i;j+=2)
{
if(i%j==0)
{
flag=1;
break;
}
}
if (flag==0)
{
arr[k++]=i;
}
}
return 0;
}
int main()
{
int t;
unsigned int a,b,i,m;
scanf("%d",&t);
prime();
while(t--)
{
scanf("%u%u",&a,&b);
for(i=0;;i++)
{
if (arr[i]>=a)
{
m=i;
break;
}
}
while(arr[m]<=b)
{
printf("%u\n",arr[m]);
m++;
}
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
如果a
的值大于arr
中的所有元素,则for()
中的第一个main()
循环会超出数组,从而产生未定义的行为。全局变量arr
初始化为零的事实有助于触发此条件:从零以外的任何a
开始,并且您立即有未定义的行为。
答案 1 :(得分:0)
你保持素数的阵列太小了。
b
的最大数量为10^9
,a
的最小数量为1.因此,您需要存储1到10亿之间的所有素数。
例如,如果在wolfram alpha中键入“1到1000000000之间有多少素数”,您将得到这两者之间存在50847534
个素数。所以你的阵列太小了。
此外,在您修复之后,您将获得TLE。您的代码对于此问题来说效率太低。您需要开发一种更快的方法来生成素数。