Hinzufügen von Zeichenfolgen von Ganzzahlen

Bin ich zu schreiben versucht, einen Algorithmus für ein größeres Projekt, das zwei strings, die beide sind große zahlen (nur mit der 10-stelligen Nummern für die Zwecke dieser demo), und fügen Sie Sie zusammen, um zu produzieren, eine endgültige Zeichenfolge, die exakt repräsentiert die Summe der beiden ursprünglichen Zeichenfolgen. Ich weiß, es gibt möglicherweise bessere Wege gegangen, haben über dies von Anfang an, aber ich soll speziell Zeichenfolgen verwenden große zahlen im Gegensatz zu einem long integer.

Mein Gedanke war, die beiden ursprünglichen strings, rückwärts, so Ihre lieben position, Zehner-position, und so auf alle line-up richtig für das hinzufügen. Dann eine position in einer Zeit, konvertieren Sie die Zeichen des strings, um die einzelnen ganzen zahlen und fügen Sie Sie zusammen, und verwenden Sie dann die Summe, wie die, position oder sonst für die Letzte saite, welche einmal abgeschlossen, werden auch Umgekehrt zurück auf die richtige Reihenfolge der Zeichen.

Wo ich in Schwierigkeiten, ich denke, das ist in der Vorbereitung für die Veranstaltung, in der die beiden zahlen von den entsprechenden Positionen in Ihrer strings hinzufügen, um eine Summe grösser als 9, und ich hätte dann tragen über einige Rest auf die nächste position. Zum Beispiel, wenn ich hatte 7 und 5 meine diejenigen Positionen, die zu 12, also ich würde immer die 2 und fügen Sie 1 auf der Zehner-position, sobald er geloopt zurück, um für die Zehner-position Betrieb.

Ich bin nicht immer die Ergebnisse, die in irgendeiner Weise genaue und nachdem er eine große Menge an Zeit, stolpern über versucht mich zu korrigieren, mein Algorithmus, ich bin mir nicht sicher, was ich tun muss um dies zu beheben.

Hoffentlich mein geplanter Prozess ist klar und jemand wird in der Lage sein zu zeigen Sie mich in die richtige Richtung oder korrigieren einige Fehler, die ich möglicherweise in meinem Programm.

Vielen Dank im Voraus.

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    string str1 = "1234567890", str2 = "2345678901"; //Two original strings of large integers
    string rev_str1, rev_str2;
    int int1 = 0, int2 = 0;
    string final; //Final product string, sum of two original strings
    int temp_int = 0, buffer_int, remainder = 0;
    string temp_str = "", buffer_str;
    char buffer[100] = {0};

    cout << "str1 = " << str1 << endl;
    cout << endl;
    cout << "str2 = " << str2 << endl;
    cout << endl;

    rev_str1 = string(str1.rbegin(), str1.rend());
    rev_str2 = string(str2.rbegin(), str2.rend());

    for (int i = 0; i < 10; i++)
    {
        buffer_str = rev_str1.at(i);
        int1 = atoi(buffer_str.c_str());
        buffer_str = rev_str2.at(i);
        int2 = atoi(buffer_str.c_str());
        buffer_int += (int1 + int2 + remainder);
        remainder = 0;

        while (buffer_int > 9)
        {
            buffer_int -= 10;
            remainder += 10;
        }

        temp_str = itoa(buffer_int, buffer, 10);
        final += temp_str;
    }

    final = string(final.rbegin(), final.rend());

    cout << "final = " << final << endl;
    cout << endl;
}
  • Ist nicht, was Sie für Fragen im Grunde ein BigInteger-Implementierung mit einem char-array?
  • Eine unheimlich seltsame ähnlichkeit mit Euler #13, ist es nicht?
  • Ist dieses Hausaufgaben?
  • Ein paar der Implementierung Kommentare, die nicht mit der Richtigkeit des Programms: Warum nutzen Sie nicht die reverse-Iteratoren, die direkt zum Durchlaufen des strings? Auch std::string::at(size_t) gibt eine char die Sie direkt hinzufügen, wenn Sie subtrahieren Sie den Wert von '0', keine Notwendigkeit für eine zwischengeschaltete std::string und atoi(). Schließlich gibt es sicherlich keine Notwendigkeit für itoa(), fügen Sie einfach den Wert von '0' und Anhängen. Schließlich könnte man die pre-Allokation der Ergebnis-string und auch Durchlaufen es, bei den meisten ist es nur eine Stelle länger als die länger der Eingabe-strings.
  • Erste machen es Arbeit für strings mit Länge null, dann die Länge 1, dann der Länge 2, dann unterschiedliche Längen, etc.
Schreibe einen Kommentar