Давайте визначимо послідовність Фібоначчі як
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Отже, у нас є нескінченна послідовність 1,2,3,5,8,13,
... Добре відомо, що будь-яке додатне ціле число може бути записане як сума деяких чисел Фібоначчі. Єдине застереження - це підсумок може бути не унікальним. Завжди існує принаймні один спосіб записати число у вигляді суми чисел Фібоначчі, але їх може бути набагато набагато більше.
Ваше завдання полягає в тому, щоб написати повну програму, яка за допомогою stdin приймає додатне ціле число від одного до одного мільйона включно, а потім виводить за допомогою stdout всі можливі підсумки чисел Фібоначчі, які підсумовують вхід. Підсумовуючи, числа Фібоначчі не повинні повторюватися, і це включає число 1
. У будь-якому підсумку, якщо 1
він присутній, він повинен бути присутнім лише один раз, тому що в моєму визначенні послідовність вище 1
відображається лише один раз. Підсумки лише з терміном є дійсними, тому, якщо вхідним числом є саме число Фібоначчі, то саме число є дійсним підсумком і повинно бути надруковано. Якщо суми декілька, то між будь-якими двома сумами повинен бути порожній рядок, щоб їх легко розрізнити.
Ось кілька зразків.
./myfib 1
1
Є лише одна така сума, і вона має лише термін, так що це все, що друкується.
./myfib 2
2
Зауважте, що 1+1
це неправдна сума, оскільки 1
повторюється.
./myfib 3
1+2
3
Дві суми, і вони друкуються між собою порожнім рядком.
./myfib 10
2+8
2+3+5
./myfib 100
3+8+89
1+2+8+89
3+8+34+55
1+2+3+5+89
1+2+8+34+55
3+8+13+21+55
1+2+3+5+34+55
1+2+8+13+21+55
1+2+3+5+13+21+55
Справжній код-гольф. Виграє найкоротший код будь-якою мовою. Будь ласка, опублікуйте свій код із деякими тестовими кейсами (крім того, який я подав вище). Що стосується зв’язків, я вибираю той, хто має найвищі результати, після того, як чекаю принаймні два тижні і, мабуть, довше. Тож, громада, будь ласка, вітає будь-які рішення, які вам подобаються. Розумність / краса коду має значення набагато більше, ніж хто публікує першим.
Щасливого кодування!