SPOJ上的SIGSEGV错误

时间:2015-02-27 08:22:45

标签: c windows

我想在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;
}

1 个答案:

答案 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并试着用它来解决这个问题。