Последняя цифра большого числа Фибоначчи
Эта проблема была взята из Coursera Специализация по структурам данных и алгоритмам, в частности из Курса Algorithmic Toolbox, неделя 2, который я Недавно закончил. Если вы проходите этот курс или планируете пройти этот курс, пожалуйста, не ждите решения, поскольку оно противоречит Кодексу чести и не принесет вам никакой пользы.
Введение в проблему
Числа Фибоначчи определяются следующим образом: F (0) = 0, F (1) = 1 и
F (i) = F (i − 1) + F (i − 2) для i ≥ 2.
описание проблемы
Задача: Для целого числа n найдите последнюю цифру n-го числа Фибоначчи F (n) (которое равно, F (n) mod 10).
Формат ввода: ввод состоит из единственного целого числа n.
Ограничения: 0 ≤ n ≤ 10 ^ 7.
Формат вывода: выведите последнюю цифру F (n). < br /> Ограничения по времени: C: 1 секунда, C ++: 1 секунда, Java: 1,5 секунды, Python: 5 секунд. C #: 1,5 секунды, Haskell: 2 секунды, JavaScript: 3 секунды, Ruby: 3 секунды, Scala: 3 секунды
Ограничение памяти: 512 Мб.
Образец 1
Вход:
3
Выход:
2
Образец 2
Ввод:
327305
Выход:
5
Что делать
Напомним, что числа Фибоначчи растут экспоненциально быстро. Например, 200-е число Фибоначчи равно 280571172992510140037611932413038677189525. Следовательно, такое решение, как
F[0]=0 F[1]=1 for i=2 to n: F[i]=F[i-1]+F[i-2] print(F[n] mod 10)
окажется слишком медленным, потому что по мере роста i итерация ith цикла вычисляет сумму более длинных и длинных чисел. Кроме того, например, F (1000) не вписывается в стандартный тип C ++ int.
Чтобы преодолеть эту трудность, вы можете сохранить в F [i] не само i-е число Фибоначчи, а только его последнюю цифру. (то есть F (i) mod 10). Вычислить последнюю цифру F (i) легко: это просто последняя цифра суммы последних цифр F (i − 1) и F (i − 2):
F[i]=(F[i-1]+F[i-2]) mod 10
Таким образом, все F [i] являются просто цифрами, поэтому они идеально вписываются в любой стандартный целочисленный тип, а вычисление суммы F [i - 1] и F [i - 2] выполняется очень быстро.
Мое решение:
Объяснение:
Что ж, тут особо нечего сказать, это не такая уж сложная проблема. Я только что реализовал алгоритм, который они предложили в разделе Что делать. Вместо того, чтобы хранить все числа Фибоначчи, просто сохраните их модуль и вычислите следующий, используя его.
Если вы можете придумать какой-либо другой способ улучшить этот алгоритм или указать на что-то, что, по вашему мнению, я сделал неправильно, вы более чем рады связаться со мной, ответив к этому и указав на ошибки. Если вам нравится это решение, нажмите кнопку «Рекомендовать» ниже, это будет много значить для меня. Спасибо.