【问题标题】:Runtime error in finding prime numbers查找素数时出现运行时错误
【发布时间】:2015-01-02 11:28:29
【问题描述】:

Spoj 问题- http://www.spoj.com/problems/PRIME1/
代码中存在逻辑错误且未运行。
IDE-代码块

int main()
{
    int t,*prime;
    long long int m,n,i,j;
    //t for number of test cases

    scanf("%d",&t);

    for(i=0;i<t;i++)
    {
        scanf("%llu%llu",&m,&n);
        prime=(int*)(malloc((n-m)*sizeof(int)));

        //Initialising all elements as 1 
        for(i=0;i<m;i++)
        {
            prime[i]=1;
        }

        prime[0]=0;
        prime[1]=0;

        //Initialising all the multiples of primes as 0 as in sieve algorithm
        for(i=m;i<n;i++)
        {
            if(prime[i]!=0){
                for(j=2;j*i<=1000000000;j++)
                {
                    prime[j*i]=0;
                }
            }
        }

        for(i=m;i<n;i++)
        {
            printf("%llu\n",i);
        }

        free(prime);
    }
    return 0;
}

【问题讨论】:

  • 你忘了问问题!出于某种原因,该按钮被标记为 。另外,你的问题描述很差。究竟是什么逻辑错误?您如何尝试运行代码以及尝试时究竟会发生什么?当您尝试调试代码时会发生什么?
  • 它没有运行但编译时没有显示错误
  • “它不运行”不是一个有用的问题描述。你是如何尝试运行它的?当你尝试时会发生什么?在调试器中运行它会发生什么?你对它的运作进行了多长时间的追踪?您实际上需要什么帮助?
  • 所以它甚至不要求输入?
  • 好吧,我不知道如何使用调试器,但程序在运行时崩溃了。

标签: c sieve-of-eratosthenes


【解决方案1】:
scanf("%lld %lld",&m,&n);
prime=(int*)(malloc((n-m)*sizeof(int)))

您正在为 n-m 元素分配内存,并且您正在尝试访问 mth 到 n-1 th 元素,这将导致未定义的行为,因此您会看到崩溃。

在同一个循环中有类似的其他访问,所以你应该注意这一点。

例如:

输入是 5 和 10,即 m=5n=10(格式说明符应该是 %lld for long long)

现在分配的内存用于 5 个元素 prime[0]prime[4]

在 for 循环中,您可以像 i&lt;n 这样访问在这种情况下,您将可以像这样访问

prime[9] 这将导致崩溃,因为您正在访问一些不是由您分配的内存

另一个访问有

prime[j*i] 如果 i=3 和 j=4 会怎样

您正在访问prime[12]

【讨论】:

  • 更不用说prime[j*i]=0;
  • @DavidSchwartz 是的,先生.. 我指出了 OP 提到发生崩溃的循环..
  • 即使删除它也会崩溃
  • 好的,所以我应该避免使用动态内存分配
  • @Beginner 实际上你不能使用动态分配,但要确保你正确处理它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2019-01-03
相关资源
最近更新 更多