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!!

16voto

hometoast Punkte 11253

Es klingt, als ob Sie nach einer Möglichkeit suchen, Zahlen mit beliebiger Genauigkeit einzugeben. Hier sind zwei Bibliotheken, die Sie verwenden können: GMP y MAPM

11voto

herohuyongtao Punkte 47389

Überprüfen Sie Die Large Integer Fallstudie in C++.pdf von Owen Astrachan. Ich fand diese Datei mit ihrer detaillierten Einführung und Code-Implementierung äußerst nützlich. Sie verwendet keine Bibliothek eines Drittanbieters. Ich habe sie benutzt, um große Zahlen zu verarbeiten (solange man genug Speicher hat, um sie zu speichern). vector<char> ) ohne Probleme.


Idee : Sie implementiert eine Integer-Klasse mit beliebiger Genauigkeit, indem sie big int in einer vector<char> .

vector<char> myDigits; // stores all digits of number

Dann werden alle Vorgänge im Zusammenhang mit dem großen int, einschließlich <<, >>, +, -, *, ==, <, !=, >, etc. kann auf der Grundlage von Operationen an diesem char array .


Geschmack des Codes : Hier ist die Header-Datei, die cpp-Datei mit den Codes finden Sie in der pdf-Datei.

#include <iostream>
#include <string> // for strings
#include <vector> // for sequence of digits
using namespace std;

class BigInt
{
public:
    BigInt(); // default constructor, value = 0
    BigInt(int); // assign an integer value
    BigInt(const string &); // assign a string
    // may need these in alternative implementation
    // BigInt(const BigInt &); // copy constructor
    // ~BigInt(); // destructor
    // const BigInt & operator = (const BigInt &);
    // assignment operator
    // operators: arithmetic, relational
    const BigInt & operator += (const BigInt &);
    const BigInt & operator -= (const BigInt &);
    const BigInt & operator *= (const BigInt &);
    const BigInt & operator *= (int num);
    string ToString() const; // convert to string
    int ToInt() const; // convert to int
    double ToDouble() const; // convert to double
    // facilitate operators ==, <, << without friends
    bool Equal(const BigInt & rhs) const;
    bool LessThan(const BigInt & rhs) const;
    void Print(ostream & os) const;
private:
    // other helper functions
    bool IsNegative() const; // return true iff number is negative
    bool IsPositive() const; // return true iff number is positive
    int NumDigits() const; // return # digits in number
    int GetDigit(int k) const;
    void AddSigDigit(int value);
    void ChangeDigit(int k, int value);
    void Normalize();
    // private state/instance variables
    enum Sign{positive,negative};
    Sign mySign; // is number positive or negative
    vector<char> myDigits; // stores all digits of number
    int myNumDigits; // stores # of digits of number
};

// free functions
ostream & operator <<(ostream &, const BigInt &);
istream & operator >>(istream &, BigInt &);
BigInt operator +(const BigInt & lhs, const BigInt & rhs);
BigInt operator -(const BigInt & lhs, const BigInt & rhs);
BigInt operator *(const BigInt & lhs, const BigInt & rhs);
BigInt operator *(const BigInt & lhs, int num);
BigInt operator *(int num, const BigInt & rhs);
bool operator == (const BigInt & lhs, const BigInt & rhs);
bool operator < (const BigInt & lhs, const BigInt & rhs);
bool operator != (const BigInt & lhs, const BigInt & rhs);
bool operator > (const BigInt & lhs, const BigInt & rhs);
bool operator >= (const BigInt & lhs, const BigInt & rhs);
bool operator <= (const BigInt & lhs, const BigInt & rhs);

7voto

Abhishek Mishra Punkte 5004

Wenn Sie Ihren eigenen Code für diesen Zweck erstellen möchten, versuchen Sie es mit Strings, um große Zahlen zu speichern ... Sie können dann grundlegende Operationen wie + - / * auf ihnen erstellen ... zum Beispiel -

#include <iostream>

using namespace std;

string add (string &s1, string &s2){
    int carry=0,sum,i;

    string  min=s1,
    max=s2,
    result = "";

    if (s1.length()>s2.length()){
        max = s1;
        min = s2;
    } else {
        max = s2;
        min = s1;
    }

    for (i = min.length()-1; i>=0; i--){
        sum = min[i] + max[i + max.length() - min.length()] + carry - 2*'0';

        carry = sum/10;
        sum %=10;

        result = (char)(sum + '0') + result;
    }

    i = max.length() - min.length()-1;

    while (i>=0){
        sum = max[i] + carry - '0';
        carry = sum/10;
        sum%=10;

        result = (char)(sum + '0') + result;
        i--;
    }

    if (carry!=0){
        result = (char)(carry + '0') + result;
    }       

    return result;
}

int main (){
    string a,b;

    cin >> a >> b;

    cout << add (a,b)<<endl;

    return 0;
}

6voto

Swati Punkte 45171

Sie möchten wissen, wie Sie die umfangreichen Eingaben, die Sie erhalten, bearbeiten können? Es gibt eine große Ganzzahl C++ Bibliothek (ähnlich wie Java), die es Ihnen ermöglicht, arithmetische Operationen durchzuführen...

3voto

shoosh Punkte 73374

Angenommen, Sie sprechen über die Eingabe von Zahlen, würde doppelte Präzision Sie bis zu 1,7976931348623157 x 10^308 erhalten

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