2010-06-26 10 views
5

Ecco il codice che ho scritto per trovare il numero di Fibonacci n-esimo:Non firmato Long lungo non andrà oltre il 93 ° numero di Fibonacci?

unsigned long long fib(int n) 
{ 
    unsigned long long u = 1, v = 1, t; 

    for(int i=2; i<=n; i++) 
    { 
     t = u + v; 
     u = v; 
     v = t; 
    } 

    return v; 
} 

Mentre l'algoritmo funziona abbastanza rapidamente, l'uscita inizia a freak out quando n> 93. Penso che lo sappia a causa della lunghezza a 64 bit dei lunghi non firmati. Sono nuovo al C++, ma ci sono modi per aggirare questo, così posso ottenere la risposta di qualcosa come fib (9999)?

Grazie

+4

Interessante. Sono stato sorpreso che i numeri di Fibonacci sono cresciuti abbastanza rapidamente che F (94)> ~ 2^63. –

+0

Errr ... come può funzionare questo codice senza parentesi per il ciclo 'for'? –

+0

@Everyone Spiacente ho fatto alcuni errori inserendo il codice. Questo è solo un errore nella trascrizione però. fib (94) mi dà ancora qualche numero di Frankenstein ... –

risposta

14

http://gmplib.org/

GMP è una libreria gratuita per arbitraria aritmetica di precisione, che operano su interi con segno, numeri razionali e numeri in virgola mobile. Non esiste un limite pratico alla precisione tranne quelli impliciti dalla memoria disponibile nella macchina su cui gira GMP. GMP ha un ricco set di funzioni e le funzioni hanno un'interfaccia regolare.

Le principali applicazioni di destinazione per le GMP sono applicazioni di crittografia e di ricerca, le applicazioni di sicurezza Internet, sistemi di algebra, la ricerca algebra computazionale, ecc ...

+2

Dannazione. 2 secondi troppo lenti. –

+0

Grazie per la risposta veloce e concisa! –

+0

http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers http://meta.stackexchange.com/questions/208693/why- was-my-answer-linking-to-my-google-code-project-deleted? lq = 1 http://meta.stackexchange.com/questions/65277/are-link-only-answers-poopractice –

4

utilizzare una libreria bigint. Ce ne sono molti in giro per il web (ad esempio, here e here) o fai il tuo.

MODIFICA: Rolling your own è molto più difficile di quanto mi aspettassi. L'aritmetica non è la parte difficile; sta stampando il risultato in forma decimale.

+0

Cosa intendi "rollare" il tuo? Scrivi il mio bigint? –

+1

@Leebuntu Sì, questo è esattamente ciò che intende dire –

+0

@Leebuntu: Sì. Per lo scopo a portata di mano, è necessario solo 'operator +', che è piuttosto semplice da codificare rispetto a un 'vettore ' che rappresenta un numero intero arbitrariamente grande. (Naturalmente, è necessario 'operatore <<' per scrivere la risposta.) –

Problemi correlati