Вот альтернативный прямой метод
Он опирается на несколько свойств:
- Каждое число Фибоначчи можно вычислить непосредственно как пол (pow (phi, n) + 0,5) (см. Расчет по округлению в http://en.wikipedia.org/wiki/Fibonacci_number). И наоборот, индекс наибольшего числа Фибоначчи, меньшего, чем i, определяется этажом (log (i * sqrt (5)) / log (phi))
- Сумма первых N чисел Фибоначчи - это N + 2-е число Фибоначчи минус 1 (см. Вторую идентичность на той же странице википедии)
- Четные числа Фибоначчи - это каждое третье число. (Посмотрите на последовательность мод 2 и результат тривиален)
- Сумма четных чисел Фибоначчи равна половине суммы нечетных чисел Фибоначчи до одной и той же точки в последовательности.
Точка 4 видна из этого:
Sum of first 3N fibonacci numbers
=(F(1) + F(2))+ F(3) +(F(4) + F(5))+ F(6) + ... +(F(3N-2) + F(3N-1))+ F(3N)
= F(3) + F(3) + F(6) + F(6) + ... + F(3N) + F(3N)
= 2( F(3) + F(6) + ... + F(3N) )
= 2 ( Sum of odd fibonacci numbers up to F(3N) )
Итак, переведите наше максимальное значение в 4000000, рассчитайте индекс наибольшего числа Фибоначчи
меньше чем это.
int n = floor(log(4000000*sqrt(5))/log(phi)); // ( = 33)
33 делится на 3, поэтому это четное число Фибоначчи, в противном случае нам нужно было бы настроить n следующим образом.
n = (n/3)*3;
Сумма всех чисел Фибоначчи до этого момента, если дана
sum = floor( pow( phi, n+2 ) + 0.5 ) - 1; // ( = 9227464 )
Сумма всех четных чисел составляет половину от этого:
sum_even = sum/2; // ( = 4613732 )
Приятно то, что это алгоритм O (1) (или O (log (N)), если вы включили стоимость pow / log), и он работает на удвоениях ... так что мы можем вычислить сумму для очень большие значения.
ПРИМЕЧАНИЕ. Я отредактировал и переместил этот ответ из закрытого дубликата этого вопроса. Фибоначчи до 4 миллионов