Ich bin relativ neu in C++, und ich versuche, eine Reihe von arithmetischen Funktionen zu erstellen, die große Zahlen verarbeiten können, mit einer Struktur namens biggie
, die die Zahlen wie eine Zeichenfolge behandelt. Ich habe momentan Schwierigkeiten mit der Subtraktionsfunktion.Inkonsistenz mit großen Zahlen Subtraktion
Wenn ich versuche, Subtrahieren mit kleinen Zahlen, funktioniert es völlig in Ordnung. Wenn ich versuche zu skalieren, funktioniert es beim ersten Aufruf der Funktion einwandfrei.
Das zweite Mal, wenn ich es mit großen Zahlen anrufe, in einer anderen Funktion, die später die GCD von zwei großen Zahlen finden wird, ändert sich die Antwort mit unterschiedlichen Laufzeiten, nur geringfügig. Manchmal ist es genau die gleiche Ausgabe wie die erste. Andere Male ist es in nur 3 Ziffern falsch, und der Rest ist in Ordnung.
Dies ist mein Code aus der subtrahieren Funktion:
biggie subtract (biggie a, biggie subtractor) {
biggie difference;
string aCopy = a.value;
int digitDifference = 0;
for (int i = aCopy.length(); i >= 0; i--) {
digitDifference = strToInt(aCopy[i]) - strToInt (subtractor.value[i]);
if (digitDifference < 0) {
aCopy[i - 1] -= 1;
digitDifference += 10;
}
difference.value += intToStr(digitDifference);
}
return difference;
}
Und das ist der Code in meinem int main()
:
biggie a;
a.value = "29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852";
biggie b;
b.value = "293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852";
cout << "a: " << a.value << endl;
cout << "b: " << b.value << endl;
cout << "diff: " << (subtract(a, b)).value << endl;
biggie gcf = gcd(a, b);
Hier ist meine gcd
Funktion: Hier
biggie gcd (biggie a, biggie b) {
cout << endl;
cout << "a: " << a.value << endl;
cout << "b: " << b.value << endl;
cout << "diff: " << (subtract(a, b)).value;
return (subtract(a, b));
}
war die Ausgabe, die ich einmal bekommen habe, wenn ich das Programm starte (alles ist perfekt, ex Ziffern 162 bis 164, die unterschiedlich sind).
a: 29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
b: 293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
diff: 191013225540743444660078221856942595327491518824156154841295494507920769420781195934078007415265514746382795296725955236558257111156901806817869021100000300281988654648450355571495534474845762360522388515575714067347551318851969118525074113760326683276593397094179939610669980991987011160199799330883848833298072487612158549561427422487741178249739429387671688555714646431881066874165038582214771077947621912806007974406604465925076449662429801117865470000000000000000000000000000000000000000000000000000000000000
a: 29345983548974568765879456985698642934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852598678954398652934598329345983548974568765879456985679864986789543986579865489756897345980650953489754687453987456984569085254897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852798654897568973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
b: 293459835489745687658794569856986429345983548974568765879456911111153489754687453987456984569085254897456876222225698567986459867895439865798654897568973459806509534897546874539874569845690852798651111168973459806509534975468745398745698456908522934598354897456876587945698567986459867895439865798654897568973459806509534897546874539874569845690852
diff: 191013225540743444660078221856942595327491518824156154841295494507920769420781195934078007415265514746382795296725955236558257111156901806817869021100000300281985724648450355571495534474845762360522388515575714067347551318851969118525074113760326683276593397094179939610669980991987011160199799330883848833298072487612158549561427422487741178249739429387671688555714646431881066874165038582214771077947621912806007974406604465925076449662429801117865470000000000000000000000000000000000000000000000000000000000000
Process returned 0 (0x0) execution time : 0.085 s
Press ENTER to continue.
Ich benutze auch OSX Yosemite und das Programm auf CodeBlocks, wenn das etwas ändert.
EDIT: Um zu klären, biggie
ist eine Struktur, die große Zahlen behandelt. biggie.value
wäre eine Zeichenfolge, die eine große Zahl enthält. Die strToInt()
und intToStr()
sind Funktionen, die genau so funktionieren, wie der Name unter Verwendung der <sstream>
-Bibliothek angibt. Hoffe das hilft.
Was ist 'biggie'? –
Warum nicht einfach etwas wie [gmp] (https://gmplib.org) verwenden? Es ist wahrscheinlich sowohl korrekter als auch schneller. –
Sorry, 'biggie' ist eine Struktur, die ich für den Umgang mit den großen Zahlen benutze. 'biggie.value' wäre eine Zeichenfolge, die eine große Anzahl enthält. Ich sollte dies in meinem Beitrag geklärt haben. – JaredCubilla