C - nochmal long Datentyp



  • Hallo,

    wenn ich die Funktion für die n-te Fibonaccizahl habe

    long fib(long n)
    {
    long fN = 1, fNminus1 = 0, fNminus2;
    for(long i=0; i<n; i++) {
    fNminus2 = fNminus1;
    fNminus1 = fN;
    fN = fNminus1 + fNminus2;
    }
    return fN;
    }

    wenn ich hier statt long überall unsigned long long schreiben würde, könnte ich dann größere fib zahlen abfragen?

    Danke,
    James



  • @JamesNguyen denkst du über die Antworten auch mal nach?



  • entschuldige nein

    also ich habe das jetzt mal implementiert so wie ich mir das vorgestellt habe

    #include <stdio.h>

    int main ( void )
    {
    auto unsigned long long fN = 1ull , fNminus1 = 0ull , fNminus2 ;

    int i ;
    
    for ( i = 0 ; i < 90 ; i ++ )
    {
    	fNminus2 = fNminus1 ;
    	fNminus1 = fN ;
    	fN = fNminus2 - fNminus1 ;
    }
    
    printf ( "%llu\n" , fN ) ;
    
    return 0 ;
    

    }

    0.-te und 1.-te Fibonacci-zahl sind bei mir 1

    jetzt stimmt bei mir die 90. Fibonacci-Zahl

    4660046610375530309

    aber bei der 91 müsste eig

    7540113804746346429

    rauskommen, bei mir kommt aber

    10906630268963205187

    wenn man sich die nächsten Fibonacci zahlen bis zur unsigned long long grenze aufschreibt wäre eig noch platz.
    bis zur 93. ?

    4660046610375530309 90.

    7540113804746346429 91.

    12200160415122000000 92.

    18446744073709551615 Grenze von unsigned long long

    19740274219868000000 93.



  • @JamesNguyen sagte in C - nochmal long Datentyp:

    4660046610375530309 90.
    7540113804746346429 91.
    12200160415122000000 92.

    fällt dir da nichts auf? Verdächtig viele Nullen sind da in der 92, bei mit ist 9+9=8 merke 1, wenn ich von Hand mal die letzte Ziffer addiere...

    Zum Code:

    fN = fNminus2 - fNminus1 ;

    Warum subtrahierst du überhaupt irgendwas?

    Edit: ansonsten wundere ich mich aber, denn deine Zahlen bis dorthin scheinen ja korrekt zu sein. 12200160415121876738 sollte rauskommen. Im Endeffekt musst du aber sowieso eine bigint-Bibliothek nutzen, um weiterzukommen.

    Und dein Compiler gibt für ULONG_MAX 18446744073709551615 zurück? Was gibt denn dein Fib(93) - 12200160415121876738ull aus? Kommt da 0 raus?



  • ah ok mit plus klappt es

    das bigint benutze ich glaube ich nicht, denke ich soll mich auf primitive datentypen beschränken.
    Danke!


Anmelden zum Antworten