24 Stimmen

Umgang mit großen Zahlen in C++?

Wie lassen sich große numerische Eingaben in C++ am besten verarbeiten (zum Beispiel 10^100 )?

Für Algorithmen wechsle ich normalerweise zu Ruby und verwende manchmal Strings.

Gibt es noch andere gute Methoden?

0 Stimmen

Ich habe versucht, ein wenig Klarheit zu schaffen. Bitte korrigieren Sie mich, wenn ich etwas falsch interpretiert habe.

0 Stimmen

Danke Sir. danke für die Bibliothek .. aber ich möchte wissen, gibt es in einer anderen Methode der doin es?. ich meine, ohne spezifische stl 's für sie.. ich habe verknüpfte Liste verwendet!!

3voto

Sergio Acosta Punkte 11210

Schauen Sie doch mal unter gmplib eine Bibliothek zur Verarbeitung von Zahlen beliebiger Genauigkeit für C und C++

3voto

Bill K Punkte 61074

Wenn Sie es genau haben wollen, brauchen Sie eine Bibliothek, die für große Zahlen ausgelegt ist. Java hat BigInt, das immer genau ist, egal wie viele Ziffern Sie es nehmen wollen, und bietet mathematische Operationen auf sie. Der gesamte Quellcode ist enthalten, Sie könnten ihn übertragen, aber das ist wirklich nicht die Art von Sache, für die C++ am besten geeignet ist - ich würde eine JVM-basierte Sprache und eine der Big-Bibliotheken verwenden.

Ich glaube nicht, dass ich Ruby dafür verwenden würde, es sei denn, Sie wollten, dass es langsam ist, und ich gehe davon aus, dass, da Sie über C++ sprechen, Geschwindigkeit etwas von einer Designüberlegung ist.

2voto

donair Punkte 21

Wie bereits von anderen erwähnt, gibt es verschiedene Bignum-/Arbitrary-Precision-Bibliotheken in C++, die Sie wahrscheinlich nützlich finden würden. Wenn Geschwindigkeit nicht notwendig ist, habe ich den Eindruck, dass Python und Lisp beide standardmäßig Bignums verwenden.

0 Stimmen

Das ist richtig für Liso. Wenn ich große Sachen mache, nehme ich Lisp :)

0 Stimmen

@Paul Nathan > Das ist richtig für Liso. Meinen Sie Lisp? oder ist Liso eine Bibliothek, die ich nicht kenne?

0voto

Sergei Krivonos Punkte 3471

Erwägen Sie boost::cpp_int

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>

int main()
{
   using namespace boost::multiprecision;

   cpp_int u = 1;
   for(unsigned i = 1; i <= 100; ++i)
      u *= i;

   // prints 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 (i.e. 100!)
   std::cout << u << std::endl;

   return 0;
}

-3voto

Ashik Punkte 1

Nun, ich denke, der beste Weg, um eine solche arithmetische Berechnung zu tun, ist durch die Verwendung von Strings. Geben Sie die Eingabe als Kommandozeilenargumente ein und manipulieren Sie dann die gesamte Logik mit String-Funktionen wie atoi() y itoa() ! Aber hey, kann man das auch für Multiplikation und Division machen? Ich denke, auf diese Weise strlen der eingegebenen Zeichenfolgen ist für die Programmierung des Compilers nicht von Bedeutung, solange die Logik nicht in Ordnung ist.

1 Stimmen

Dies ist keine gute Lösung. Die Eingabe von Kommandozeilenargumenten macht Ihr Programm unbrauchbar, es sei denn, Sie machen eine Art Kommandozeilenrechner. Außerdem ist die Verwendung von ato* Funktionen geht davon aus, dass Sie den gewünschten Datentyp bereits kennen UND dass sie im Standardpräzisionsbereich liegen werden. Es macht also keinen Sinn, Zeit mit der Konvertierung in diese Formate zu verschwenden, anstatt direkt in Ihr großes Zahlenformat, wenn Sie diese Zahlen nur noch einmal parsen müssen, vorausgesetzt, Sie haben sie überhaupt richtig eingelesen. itoa ist auch nicht Teil der Standard-C++-Bibliothek.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X