möchte mit langen Ganzzahlen rechnen



  • Ingo schrieb:

    Ich möchte mit Ganzzahlen im Bereich von ca. 100 Milliarden rechnen. long int reicht aber nur von ca. -2 bis +2 Millidarden, unsigned bis knapp über 4 Milliarden. Kann einer einen Rat geben, wie man trotzdem mit Werten darüber rechnen kann?

    Das kommt aber auf die Sprache an, wie groß ein long ist. 😉
    In Java und C# hast du damit einen Wertebereich von -2^63 bis +2^63-1, das reicht also für deine 100 Milliarden locker aus. Unter C++ kannst du ja mal für 64Bit compilieren oder "long long int" benutzen. 🙂



  • Da ich den VC 6.0 und BCB 5.0 habe, kann ich das mit long long int wohl vergessen. Das ist wirklich ärgerlich.



  • Mit VC 6.0 funktioniert __int64.



  • Mit unsigned _int64 oder unsigned long long kannst du bis 18 Trillionen rechnen. Hier ein Beispiel:

    //Version für Compiler wie den Dev-C++ mit unsigned long long:
    
    // Berechnung der "3n+1"-Folge (Collatz-Folge)
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main() 
    { 
      /*********************************************************** Eingabebereich ****************************/ 
      const unsigned long long element_limit       =             1000000 ; // Maximum H(n) 
      const unsigned long long element_print_limit =                1000 ; // Ausgabe nur, wenn H(n) > element_print_limit 
      const unsigned long long start               = 1000000000000000000 ; // Beginn der Berechnung bei start 
      const unsigned long long end                 = 2000000000000000000 ; // Ende der Berechnung bei end 
      /*********************************************************** Eingabebereich ****************************/ 
    
      for( unsigned long long j = start; j < end; j++ ) 
      { 
           unsigned long long zahl = j ; 
           unsigned long long    i = 1 ; 
           while( ( zahl != 1 ) && ( i <= element_limit ) ) 
           { 
                if( zahl % 2 == 0 ) 
                    zahl /= 2 ; 
                else 
                    zahl = 3 * zahl + 1 ; 
                i++ ; 
           } 
    
           if( zahl == 1 ) 
           { 
                if( i > element_print_limit ) 
                { 
                    cout << "Startzahl: " << j;
                    cout << "\tAnzahl: "  << i << endl;
                } 
           } 
           else 
           { 
               cout << "Startzahl: " << j;   
               cout << "kein Resultat (Anzahl-Limit erhoehen)" << endl;
           } 
    
           if( i > element_limit ) cerr << "Anzahl zu hoch" << endl;
      } 
      getch();
    }
    


  • das ist aber meines Wissens nicht portabel.



  • @E. H.: Ich danke dir für das Posting, aber mein VC akzeptiert das leider nicht.

    __int64: arbeitet leider nicht mit cin und cout zusammen. Oder muss man noch was einbinden?



  • Nein, das sollte schon gehen.



  • VC akzeptiert das leider nicht.

    Ersetze long long durch _int64 (falls MSVC++ 6), MSVC++ 7.1 akzeptiert long long (stammt von C).



  • __int64: arbeitet leider nicht mit cin und cout zusammen.

    es geht mit printf(...) da gibt es ein passendes format flag. Muss mal suchen.

    siehe mal hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=46148&highlight=int64+printf



  • Danke, das funktioniert schon mal ziemlich gut, soweit ich das bis jetzt überblicke!


Anmelden zum Antworten