Определение отдельных букв строк Фибоначчи?

Строки Фибоначчи определяются следующим образом:

  • Первая строка Фибоначчи - это «a»
  • Вторая строка Фибоначчи - это "bc"
  • (n + 2) -я строка Фибоначчи представляет собой конкатенацию двух предыдущих строк Фибоначчи.

Например, первые несколько строк Фибоначчи равны

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;
}

Это правильно? Как бы вы сделали?

8
задан templatetypedef 23 October 2013 в 00:52
поделиться