【问题标题】:Prime no between m and nm和n之间的素数
【发布时间】:2014-07-25 00:29:51
【问题描述】:

我在 SPOJ(link : http://www.spoj.com/problems/PRIME1/) 中尝试了一个不生成的质数问题。 我正在使用 seive 算法。使用 spoj gcc 时出现 SIGSEGV 错误。但是当我使用我的 ubuntu gcc 编译时,它适用于所有测试用例。

这是我的源代码。请帮忙

float sqroot( float x)
{ 
    float a , b;
    a = x; // copy given value to 'a'
    do
    {
        b = a; // copy value of 'a' to 'b' before 'a' is modify
        a = (a + x/a) / 2; // modify 'a' value until we reach sqroot result
    }
    while( a!= b); // execute loop until a == b
    return( a); // 'a ' or 'b' is sqroot of 'x'
}
int main()
{
    int prime[4000];
    int prime_index=0;
    bool find_prime[100001];
    int i,j;
    int m,n;
    int iremainder;
    int T,t_index;
    int PRIME_FLAG=1;
    float square;
    int limit;
    prime_index++;
    prime[prime_index]=2;
    for(i=3;i<=32000;i=i+2)
    {
        PRIME_FLAG=1;
        square = sqroot((float)i);
        limit = ((int)(square))+1;
        for(j=1;j<=prime_index,prime[j]<=limit;j++)
        {
            if(prime[j]!=0)
            {
                if((i%prime[j]) == 0)
                {
                    PRIME_FLAG = 0;
                    break;
                }
            }
        }
        if(PRIME_FLAG)
        {
            prime_index++;
            prime[prime_index]=i;
            printf("%d\n",i);
        }
    }
    printf("Enter the no of test cases:");
    scanf("%d",&T);
    if(T<=10)
    {
        for(t_index=1;t_index<=T;t_index++)
        {
            printf("Enter the values of m and n :");
            scanf("%d%d",&m,&n);
            if((m>=1) && (n<=1000000000) && ((n-m)<=100000))
            {
                if(m == 1)
                    m=2;

                //Set all numbers from m to n as prime 
                for(i=m;i<=n;i++)
                    find_prime[i]=true;
                //Find the prime numbers between m to n
                square = sqroot((float)n);
                limit = ((int)(square))+1;
                for(i=1;i<=prime_index,prime[i]<=limit;i++)
                {
                    if(m>=prime[i])
                    {
                        if(prime[i]!=0)
                            iremainder=m%prime[i];
                        j=prime[i]*iremainder;
                    }
                    else
                    {
                        iremainder=prime[i]-m;
                        if(m+iremainder == prime[i])
                            j=2*(m+iremainder);
                        else
                            j=m+iremainder;
                    }
                    for(;j<=n;j=j+prime[i])
                        find_prime[j]=false;
                }
                //Print all prime no's
                for(i=m;i<=n;i++)
                {
                    if(find_prime[i])
                        printf("%d\n",i);
                }
            } 
        }
    }
    return 0;
}

【问题讨论】:

  • 你运行这段代码了吗???告诉我们哪个测试用例失败了?对我来说它工作正常。
  • bool find_prime[100001];int prime[4000]; 闻起来像堆栈溢出。
  • 我已经更新了代码,但是当 m=100000 和 n=100010 时,它在测试用例中仍然失败

标签: c


【解决方案1】:

你的 for 循环是错误的。

for(j=1;j<=prime_index,prime[j]<=limit;j++)

应该是

for(j=1;(j<=prime_index)&&(prime[j]<=limit);j++)

第一个条件会被执行,但结果会被忽略。

所以很幸运,您在超出数组范围之前在未初始化的数组中发现了一个大于限制的数字,这将导致 SIGSEGV。

for(i=1;i<=prime_index,prime[i]<=limit;i++)

有同样的问题。

Click here for more details

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 2019-04-01
    • 2018-09-30
    • 1970-01-01
    • 2014-07-16
    • 2021-08-07
    • 2022-11-12
    • 2021-10-16
    相关资源
    最近更新 更多