BigInteger



  • ... wollte mein Collatz-Programm auf beliebig große Integer umstellen, wählte Bibliothek BigInteger, allerdings noch ein Link-Problem, das ich nicht verstehe.
    Vielleicht gibt es hier Erfahrung. MS VC++ 2008.

    //deleted (gelöst)

    Compiler o.k.
    Linker-Meldung: 2001 und 1120
    BigIntegerUtils.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall BigInteger::BigInteger(class BigUnsigned const &,enum BigInteger::Sign)" (??0BigInteger@@QAE@ABVBigUnsigned@@W4Sign@0@@Z)".
    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.



  • 1. musst vll noch ne lib dazulinken?!

    2. wahrscheinlich hat BigUnsigned den operator << nicht überladen...

    bb



  • http://mattmccutchen.net/bigint/index.html

    ad 1) war keine lib dabei



  • Erhard Henkes schrieb:

    http://mattmccutchen.net/bigint/index.html

    ad 1) war keine lib dabei

    Aber .cc-Dateien, die laut README entweder vom Makefile in eine lib gebunden oder von Dir in das Projekt eingefügt werden müssen.



  • Die ganzen cc-Dateien habe ich ins Projekt eingebunden. Vielleicht habe ich eine übersehen, muss mal nachschauen. Hatte BigInteger.cc übersehen. Thx.

    Jetzt klappt es gut, möchte doch in unerforschtem Gebiet analysieren. 😉

    // Berechnung der "3n+1"-Folge (Collatz-Folge)
    #include <iostream>
    #include <limits>
    #include <string>
    #include "BigIntegerLibrary.h"
    
    using namespace std;
    
    void wait()
    {
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
      std::cin.get();
    }
    
    int main()
    {
        /*********************************************************** Eingabebereich ****************************/
      BigUnsigned element_limit(1000000) ;      // Maximum H(n)
      BigUnsigned element_print_limit(4100) ;    // Ausgabe nur, wenn H(n) > element_print_limit
    
      string s("10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");             // Beginn der Berechnung bei start
      BigUnsigned start = easyStringToBI(s);
    
      s = "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000";                    // Ende der Berechnung bei end
      BigUnsigned end = easyStringToBI(s);  
      /*********************************************************** Eingabebereich ****************************/
    
      for( BigUnsigned j = start; j < end; j++ )
      {
           BigUnsigned zahl = j ;
           BigUnsigned    i = 1 ;
           while( ( zahl != BigUnsigned(1) ) && ( i <= element_limit ) )
           {
                //cout << zahl << '\t';
                BigUnsigned rest = zahl % BigUnsigned(2);
                if( rest != BigUnsigned(1) )
                    zahl /= BigUnsigned(2) ;
                else
                    zahl = BigUnsigned(3) * zahl + BigUnsigned(1) ;
                i++;
           }
    
           if( zahl == BigUnsigned(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;
      }
    
      wait();
    }
    



Anmelden zum Antworten