Строки Фибоначчи определяются следующим образом:
Например, первые несколько строк Фибоначчи равны
a
bc
abc
bcabc
abcbcabc
Цель состоит в том, чтобы получить строку и смещение , чтобы определить, какой символ находится по этому смещению. Более формально:
Ввод: Два целых числа, разделенных пробелом - K и P (0
9 ), ( 9 ), где K - номер строки в строке Фибоначчи, а P - номер позиции в строке.
Вывод: Желаемый символ для соответствующего теста: «a», «b» или «c». Если P больше k-й строки (K ≤ 10 9 ), необходимо вывести «Нет решения»
Пример:
ввод: 18 58
вывод: a
Я написал этот код для решения проблемы:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int k, p;
string s1 = "a";
string s2 = "bc";
vector < int >fib_numb;
fib_numb.push_back(1);
fib_numb.push_back(2);
cin >> k >> p;
k -= 1;
p -= 1;
while (fib_numb.back() < p) {
fib_numb.push_back(fib_numb[fib_numb.size() - 1] + fib_numb[fib_numb.size() - 2]);
}
if (fib_numb[k] <= p) {
cout << "No solution";
return 0;
}
if ((k - fib_numb.size()) % 2 == 1)
k = fib_numb.size() + 1;
else
k = fib_numb.size();
while (k > 1) {
if (fib_numb[k - 2] > p)
k -= 2;
else {
p -= fib_numb[k - 2];
k -= 1;
}
}
if (k == 1)
cout << s2[p];
else
cout << s1[0];
return 0;
}
Это правильно? Как бы вы сделали?