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 einechar
die Sie direkt hinzufügen, wenn Sie subtrahieren Sie den Wert von'0'
, keine Notwendigkeit für eine zwischengeschaltetestd::string
undatoi()
. Schließlich gibt es sicherlich keine Notwendigkeit füritoa()
, 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich kam mit. Es ist nur für zwei Summanden; wenn du mehr hast, wirst du anpassen müssen, um die Dinge ein wenig, im besonderen mit dem tragen, der kann dann größer sein als 19, und die Art und Weise der Ergebnis-string wird zugewiesen:
Dein problem ist, dass Sie die Durchführung 10s anstelle von 1s. Wenn Sie hinzufügen
19 + 5
erhalten Sie 4 in den Einheiten, die position und fügen Sie eine zusätzliche 1 in der 10er position. Sie würde nicht fügen Sie eine zusätzliche 10 in der 10er position.Müssen Sie einfach ändern Sie diese Zeile:
remainder += 10;
zuremainder += 1;
.Auch, dass
while
Schleife ist nicht erforderlich, wenn Sie mehr als zwei Summanden. Wie ist es, wenn Sie das hinzufügen von nur zwei Ziffern in einer Zeit, die größten Summanden, die Sie haben können9 + 9
, die trägt nur 1.while
Schleife, denken Sie daran, dass einige Architekturen haben nicht einmal eine integer-division Unterricht, und es ist ziemlich langsam, auf diejenigen, die tun. Ich begrüße die Geschwindigkeit Vergleiche, obwohl.using namespace std;
main(){
}