Проект Эйлера, проблема 5 Ошибка сегментации: 11 - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь решить задачу 5 Project Euler, которая:

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;
} 

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете попробовать отладить свой код, сократив количество значений с 20 до 5.

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

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

Несколько проблем с вашим кодом:

  1. Поскольку вы звоните integerDivision(num + 1) по всем номерам, не делящимся num, это приведет к экспоненциальному росту, и ваша программа будет отключена. Чтобы исправить это, вы можете добавить return; после integerDivision(num + 1)
  2. Ваш код теперь будет работать для меньших значений, скажем, 10, но все равно не будет работать для 20. Вы используете рекурсию, которая вызовет переполнение стека для больших чисел , Попробуйте сделать то же самое с итерацией.
...