Редакция для Число Фибоначчи
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно вычислить n-е число Фибоначчи, где:
F(1) = 1F(2) = 1F(k) = F(k - 1) + F(k - 2)приk > 2
Самый прямой способ — последовательно строить числа Фибоначчи от первых двух к нужному номеру.
Хранить всю последовательность не требуется. Чтобы получить следующее число, достаточно знать только два предыдущих. Поэтому будем поддерживать две переменные:
a— предыдущее числоb— текущее число
Тогда следующее число равно a + b.
2. Наблюдения
Для
n = 1иn = 2ответ сразу равен1.Для любого
n >= 3можно идти циклом от3доn, каждый раз пересчитывая следующее число Фибоначчи.Нам не нужен массив, потому что в формуле участвуют только два последних значения.
По условию
n <= 90, и ответ гарантированно помещается вlong long, поэтому в C++ достаточно типаlong long.
3. Алгоритм
- Считать
n. - Если
n == 1илиn == 2, вывести1. - Иначе:
- присвоить
a = 1,b = 1 - для всех
iот3доn:- вычислить
c = a + b - сдвинуть значения:
a = b,b = c
- вычислить
- присвоить
- После цикла в
bбудет находитьсяF(n). - Вывести
b.
4. Почему это работает
Покажем, что после каждого шага цикла переменные действительно хранят нужные числа Фибоначчи.
Перед началом цикла:
a = 1 = F(1)b = 1 = F(2)
Пусть перед некоторой итерацией выполняется:
a = F(i - 2)b = F(i - 1)
Тогда мы вычисляем:
c = a + b = F(i - 2) + F(i - 1) = F(i)
После этого делаем:
a = b, значит теперьa = F(i - 1)b = c, значит теперьb = F(i)
То есть после итерации инвариант сохраняется для следующего шага.
Когда цикл закончится на i = n, переменная b будет равна F(n), что и требуется вывести.
5. Сложность
- Время:
O(n), потому что выполняется один цикл длиной доn - Память:
O(1), потому что используется только несколько переменных
6. Код на C++17
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
if (n == 1 || n == 2) {
cout << 1 << '\n';
return 0;
}
long long a = 1;
long long b = 1;
for (int i = 3; i <= n; i++) {
long long c = a + b;
a = b;
b = c;
}
cout << b << '\n';
return 0;
}
7. Код на Python 3
n = int(input())
if n == 1 or n == 2:
print(1)
else:
a = 1
b = 1
for _ in range(3, n + 1):
c = a + b
a = b
b = c
print(b)
Комментарии