2017-06-04 3 views
-1

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.

+0

Was ist 'biggie'? –

+1

Warum nicht einfach etwas wie [gmp] (https://gmplib.org) verwenden? Es ist wahrscheinlich sowohl korrekter als auch schneller. –

+0

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

Antwort

2

Da dies ein Schulprojekt ist, gebe ich einige Hinweise und keine direkten Antworten.

Sie zeigen nicht die operator[] für biggie. Dies könnte ein Problem sein; Überlegen Sie, was passiert, wenn a länger als subtractor ist.

diesen Testfall Versuche: 284 - 86.

Ist links nach rechts dem besten Weg, um dabei eine Subtraktion zu gehen?