Vamos definir a sequência de Fibonacci como
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Portanto, temos a sequência infinita 1,2,3,5,8,13,
... É sabido que qualquer número inteiro positivo pode ser escrito como uma soma de alguns números de Fibonacci. A única ressalva é que esse somatório pode não ser único. Sempre há pelo menos uma maneira de escrever um número como uma soma dos números de Fibonacci, mas pode haver muitos mais.
Seu desafio é escrever um programa completo que, usando stdin, receba um número inteiro positivo entre um e um milhão, inclusive, e emita usando stdout todas as somas possíveis de números de Fibonacci que somam a entrada. Em resumo, os números de Fibonacci não devem se repetir e isso inclui o número 1
. Em qualquer soma, se 1
estiver presente, deve estar presente apenas uma vez, porque na minha definição da sequência acima 1
aparece apenas uma vez. As somas com apenas um termo são válidas, portanto, se o número de entrada for um número de Fibonacci, o número em si será uma soma válida e deverá ser impresso. Se várias somas, entre duas somas, deve haver uma linha em branco para distinguir facilmente entre elas.
Aqui estão algumas amostras.
./myfib 1
1
Existe apenas uma dessas somas e tem apenas um termo, e é isso que é impresso.
./myfib 2
2
Observe aqui que 1+1
não é uma soma válida porque se 1
repete.
./myfib 3
1+2
3
Duas somas e ambas são impressas com uma linha em branco no meio.
./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
Verdadeiro código de golfe. O código mais curto em qualquer idioma vence. Poste seu código com alguns casos de teste (além do que eu forneci acima). No caso de empate, eu escolho aquele com os votos mais altos depois de esperar pelo menos por duas semanas e provavelmente mais. Portanto, a comunidade sinta-se à vontade para votar em qualquer solução que desejar. A inteligência / beleza do código é muito mais importante do que quem publica primeiro.
Feliz codificação!