Cálculo de nº secreto utilizando os nºs Fibonacci

4 respostas
J

Boa tarde pessoal,

Gostaria de um auxílio para resolver este problema(tentarei explicá-lo aseguir):

Terei que trabalhar com os numeros Fibonacci, que todos sabemos que cada numero seguinte é a soma dos dois anteriores(ex. 1, 2, 3 ,5, 8, 13, 21, 34, 55, 89…) .
Meu problema: Todo nº inteiro positivo pode ser escrito com a soma de algusn nºs Fibonacci(ex. o 100 é = 3 + 8 + 89), onde na soma não podem haver numeros usados mais de uma vez e os nºs(Fibonacci) usados não podem ser consecutivos(ex. se usou o 5, o 8 e o 3 não devem ser usados).

Como mostrei no exemplo acima, para gerar o 100 usamos 3 nºs(3 + 8 + 89), o z é a quantidade de termos usados para formar o nº, neste caso z(100) = 3, assim como o z(3) = 1(pois não pode-se usar o 1 e o 2, pois embora nºs Fibonacci os mesmos são sequenciais, que não pode-se usar aqui).

Agora que “acho” que expliquei como funciona, minha “Missão i[/i]Impossível” é: Achar a soma destes nºs “z” dos inteiros naturais de 1 a 10 milhões .

Ex. se fosse de 1 a 5, seria { z(1)=1 + z(2)=1 + z(3)=1 + z(4)=2 + z(5)=1 --> = 6 (1 + 1 + 1 + 2 + 1)}

*** Não pode-se usar tipos Inteiros Longos, usar portanto nºs com até 32 bits.
O programa deve ser o mais rápido possível

Se alguém puder me auxiliar nesta missão eu agradeço muito…

Grato,
Jeferson Neves

4 Respostas

E


Dica: use um BitSet para armazenar, de forma eficiente, os números de Fibonacci de 1 até 10 milhões. O método nextSetBit pode até ser usado, porque ele é mais rápido que inspecionar manualmente cada bit do BitSet, mas idealmente você precisaria de um método “previousSetBit”, que não existe.
Para remediar isso, você pode associar à posição 0 o elemento 10 milhões - 1, à posição 1 o elemento 10 milhões - 2, … à posição 9999999 do BitSet o elemento 0.

EDIT - Aham, a dica que dei não é muito boa, afinal.

Vou tentar escrever algo mais útil.

E

http://projecteuler.net/index.php?section=problems&id=297

Adelar

Para calcular os números de fibonacci de forma aproximada pode-se usar a fórmula:

Fn = (1/raiz_quadrada(5.)) * ( ((1+raiz_quadrada(5.))/2)^n - ((1-raiz_quadrada(5.))/2)^n)

O sinal ^ indica operação de potência.

Primeiros números:
F0=0
F1=1
F2=1
F3=2

O problema é que quanto maior o número mais imprecisa vai ser a fórmula.

Att.

J

Bom dia,

Grato pelas dicas, vou passar as infos para a pessoa que estou tentando auxiliar, para ver se com isso conseguimos fazer alguma coisa, qualquer coisa posto aqui novamente.

Até+.

Criado 11 de agosto de 2010
Ultima resposta 12 de ago. de 2010
Respostas 4
Participantes 3