2010-06-26 9 views
5

Hier ist der Code, den ich für die Suche nach der n-ten Fibonacci-Zahl hat geschrieben:Unsigned Long Long geht nicht über die 93. Fibonacci-Nummer hinaus?

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

Während der Algorithmus ziemlich schnell läuft, beginnt die Ausgabe an ausflippen, wenn n> 93. Ich denke/weiß, dass es wegen der 64-Bit-Größe des unsigned long long ist. Ich bin neu in C++, aber gibt es Möglichkeiten, dies zu umgehen, so dass ich die Antwort von etwas wie fib (9999) bekommen kann?

Dank

+4

Interessant. Ich war überrascht, dass die Fibonacci-Zahlen schnell genug gewachsen sind, dass F (94)> ~ 2^63. –

+0

Errr ... wie kann dieser Code ohne Klammern für die 'for' Schleife funktionieren? –

+0

@Everyone Leider habe ich einige Fehler bei der Eingabe des Codes gemacht. Dies ist jedoch nur ein Fehler beim Transkribieren. fib (94) gibt mir immer noch eine Frankenstein-Nummer ... –

Antwort

14

http://gmplib.org/

GMP ist eine freie Bibliothek für beliebig genaue Arithmetik, auf signierte ganze, rationale Zahlen arbeiten und Gleitkommazahlen. Es gibt keine praktische Grenze für die Genauigkeit außer den durch den verfügbaren Speicher in der Maschine, auf der GMP läuft, implizierten. GMP verfügt über umfangreiche Funktionen und die Funktionen haben eine reguläre Oberfläche.

Die wichtigsten Zielanwendungen für GMP sind Kryptographie-Anwendungen und Forschung, Internet-Sicherheitsanwendungen, Algebrasysteme, Computational Algebra Forschung, etc ...

+2

Verdammt. 2 Sekunden zu langsam. –

+0

Danke für die schnelle und präzise Antwort! –

+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-zu-meinem-Google-Code-Projekt-gelöscht? lq = 1 http://meta.stackexchange.com/questions/65277/are-link-only-answers-poor-practice –

4

eine Bigint Bibliothek verwenden. Es gibt viele im Internet (z. B. here und here) oder rollen Sie Ihre eigenen.

EDIT: Rolling your own ist viel schwieriger als ich erwartet hatte. Die Arithmetik ist nicht der schwierige Teil; Es wird das Ergebnis in dezimaler Form ausgedruckt.

+0

Was? meinst du "rollen" deine eigenen? Schreib meine eigene Bigint? –

+1

@Leebuntu Ja, das ist genau das, was er meint –

+0

@Leebuntu: Ja. Für den vorliegenden Zweck brauchen Sie nur 'operator +', was relativ einfach zu codieren ist in Bezug auf einen 'Vektor ', der eine beliebig große Ganzzahl darstellt. (Natürlich würde man 'operator <<' brauchen, um die Antwort auszugeben.) –

Verwandte Themen