【问题标题】:Project Euler problem 5 Segmentation fault: 11Project Euler 问题5 分段错误:11
【发布时间】:2020-04-28 17:26:25
【问题描述】:

我正在尝试解决 Project Euler 的 problem 5,即:

2520 是可以除以 1 到 10 的每个数字而没有任何余数的最小数字。能被 1 到 20 的所有数整除的最小正数是多少?

我的程序符合要求,但是当我执行它时,它会显示以下消息:

分段错误:11

void integerDivision(int num)
{
    int i = 0;
    int smallestNumber = 0;
    int remainder = 0;
    int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
                    11, 12, 13, 15, 16, 17, 18, 19, 20};

    for(int j = i; j < 20; j++)
    {
        remainder = num % numbers[j];
        if (remainder  == 0)
        {
            continue;
        }
        else
        {
            i = 0;
            integerDivision(num + 1);
        }  
    }
    smallestNumber = num / numbers[i];
    cout << smallestNumber << endl;
}

int main(void)
{
    integerDivision(1);
    return 0;
} 

【问题讨论】:

  • 如果num 是否定的,这在很多方面都会出错。
  • 可能是由于递归过多导致堆栈溢出。使用调试器检查退出条件。

标签: c++ arrays segmentation-fault


【解决方案1】:

您可以尝试通过将值的数量从 20 减少到 5 来调试代码。

int numbers[] = {1, 2, 3, 4, 5};

for(int j = i; j < 5; j++)

你的代码有几个问题:

  1. 由于您调用integerDivision(num + 1) 来获取所有不除以num 的数字,它会产生指数增长并且您的程序将超时。要解决此问题,您可以在 integerDivision(num + 1) 之后添加 return;
  2. 您的代码现在可以用于较小的值,例如 10,但对于 20 仍然会失败。您正在使用递归,这将导致大量数字的堆栈溢出。尝试用迭代做类似的事情。

【讨论】:

  • 谢谢。我试过你说的,当数字大小大于 12 时会导致堆栈溢出。
  • @Ratman305 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2023-02-13
  • 2020-03-17
  • 2010-09-17
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多