我想在SPOJ上解决问题PRIME1。当我运行代码块并输入测试示例时,我得到了正确的答案。但是当我将代码提交给SPOj时,我收到了SIGSEGV错误。以下是SPOJ上此错误的解释: SIGSEGV(信号11) - 非解释语言最常见的错误:a"分段错误"该计划。这可能是由例如通过超出范围的数组索引导致缓冲区溢出,错误初始化指针等。 但我在代码中找不到这种类型的问题。有人可以帮帮我吗?
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <math.h>
int prim(int n)
{
int s, i;
if (n == 1 || n == 2)
return 1;
if (n % 2 == 0)
return 0;
s = (int)sqrt(n);
for (i=3; i<=s; i+=2)
if (n % i == 0)
return 0;
return 1;
}
void print(int a,int b)
{
int *p,i,k;
int g;
g=(b/2);
p = (int *) malloc (sizeof(int)*(b-a+1));
for(i=0;i<(b-a+1);i++) p[i]=a+i;
for(i=0;i<=g;i++)
{
if(p[i] && prim(p[i]))
{
for(k=i*2+a;k<b-a;k+=i+a)
p[k]=0;
}
if(!prim(p[i]))
{
p[i]=0;
for(k=i*2+a;k<=b-a;k+=i+a)
p[k]=0;
}
}
for(i=0;i<(b-a+1);i++) if(p[i]!=0) printf("%d ",p[i]);
free(p);
}
int main(void)
{
int t,i,m,n;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d %d",&m,&n);
print(m,n);
}
return 0;
}
答案 0 :(得分:1)
问题是g可能大于或等于(b-a + 1),具体取决于测试用例。由于g = b/2
然后数组索引i
不会超出范围,b/2 < b-a+1
意味着b/2 > a-1
。这不是必要的。根据问题的限制,a
可以说是6,b
可以是7。
同样根据约束条件,您的代码可能会给出TLE。您的算法目前处于最差情况O((n-m)*sqrt(n))
,我认为这不足以在此问题中得到AC。
阅读有关Eratosthenes的Sieve并试着用它来解决这个问题。