2016-10-30 6 views
0

В настоящее время я пытаюсь решить некоторые проблемы проектов Euler, но в настоящее время я застрял во второй проблеме. Вот то, что я прямо сейчас:Fibonacci Последовательность с векторами

void p002() 
{ 
    unsigned int result = 0;  
    std::vector<int> fibonacci{ 1,2 }; 

    for (int i = 2; fibonacci.at(i) < 4000000; i++) 
    { 
     fibonacci.at(i) = fibonacci.at(i - 1) + fibonacci.at(i - 2); //<- Doesn't work 
     if (fibonacci.at(i) % 2 == 0) 
      result += fibonacci.at(i); 
    } 

    std::cout << result; 
} 

Может кто-то помочь мне и скажите мне, почему это одна линия, кажется, не работает? (Я получаю сообщение об ошибке «abort(), вызванное« ошибкой при попытке выполнить код ».)

В случае, если кто-либо задается вопросом: задача состоит в том, чтобы получить сумму всех целых чисел последовательности фибоначчи с более низким значением, чем 4 000 000, которые даже многозначный.

Спасибо!

+0

вектор не может изменять размеры без необходимости вызова соответствующих функций. Это должно быть достаточно информации, чтобы вы знали, что может быть проблемой. Во-вторых, это один лайнер с использованием 'std :: accumulate' и [формулы Бине] (http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibFormula.html#section1) – PaulMcKenzie

+0

* Задача состоит в том, чтобы получить сумму всех целых чисел последовательности фибоначчи с более низким значением, чем 4 000 000, которые являются четными. * - Кроме того, для решения проблемы вам не нужен вектор, если вы использовали приведенную выше формулу в комментарии, и просто цикл, добавив к итогу. – PaulMcKenzie

ответ

1

vector::at вызывает исключение, если вы пытаетесь получить доступ к элементу по индексу, который выходит за рамки. Ваш вектор содержит 2 элемента (по индексам 0 и 1). Поэтому fibonacci.at(2) выходит за пределы, и возникает исключение. Вы не поймаете исключения, поэтому вызывается std::terminate. По умолчанию std::terminate указывает на abort, который завершает процесс.

Решение: добавьте в вектор достаточное количество элементов, чтобы fibonacci.at(i) не был за гранью.