Сложение столбиком не забыли? Не самая эффективная реализация, но для этой задачи сойдет. Числа представлены как строки, add
складывает их столбиком:
#include <iostream>
#include <string>
int digit(const std::string &s, size_t i) {
return (i < s.size()) ? s[s.size() - i - 1] - '0' : 0;
}
std::string add(const std::string &a, const std::string &b) {
std::string c;
int carry = 0;
for (size_t i = 0; carry != 0 || i < a.size() || i < b.size(); ++i) {
const int s = carry + digit(a, i) + digit(b, i);
carry = s / 10;
c.insert(0, 1, static_cast<char>('0' + s % 10));
}
return c;
}
std::string f(int n) {
std::string a = "1";
std::string b = "1";
for (int i = 0; i < n; ++i) {
std::string c = add(a, b);
a = b;
b = c;
}
return b;
}
int main() {
int n;
std::cin >> n;
std::cout << f(n) << '\n';
}
$ g++ -std=c++17 -pedantic -Wall -Wextra -Werror -Wwrite-strings -Wconversion bit_seqs.cpp
$ echo 100 | ./a.out
927372692193078999176
Или так:
#include <iostream>
int main() {
const int N = 21;
int buffer1[N] = {1, 0};
int buffer2[N] = {1, 0};
int n;
std::cin >> n;
int *a = buffer1;
int *b = buffer2;
for (int i = 0; i < n; ++i) {
int carry = 0;
for (int j = 0; j < N; ++j) {
const int s = carry + a[j] + b[j];
a[j] = s % 10;
carry = s / 10;
}
int *t = a;
a = b;
b = t;
}
bool print = false;
for (int j = N - 1; j >= 0; --j) {
print = print || b[j] != 0;
if (print) {
std::cout << b[j];
}
}
std::cout << '\n';
}
P.S. Кешировать в векторе все значения функции для этой задачи излишне. Двух старших значений достаточно чтобы вычислить следующее.
P.P.S. Настаиваю что f(0) = 1
. Не ноль как у вас.
P.P.P.S Упражнение: почему "не самая эффективная реализация"?