2017-06-04 59 views
-1

我對C++比較陌生,我試圖創建一組能夠處理大數字的算術函數,使用一個名爲biggie的結構來處理像字符串這樣的數字。我目前在減法功能上遇到困難。與大數減法不一致

當我運行嘗試減去小數字,它工作得很好。當我嘗試按比例放大時,第一次調用該函數時效果很好。

第二次我用大數字來調用它,在另一個稍後會找到兩個大數字的GCD的函數中,答案會隨着不同的運行時間而略微變化。有時,它與第一個輸出完全相同。其他時候,只有3位數字是錯誤的,其餘的都很好。

這是從減函數我的代碼:

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; 
} 

而且這是在代碼我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); 

這裏是我的gcd功能:

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)); 
} 

這裏是我得到的輸出,當我運行程序(一切都完美的前接收數字162至164,這是不同的)。

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. 

我也使用OSX Yosemite並在CodeBlocks上運行程序,如果這改變了任何東西。

編輯:澄清,biggie是一個處理大數字的結構。 biggie.value將是一個包含大量數字的字符串。 strToInt()intToStr()是完全按照名稱暗示使用<sstream>庫的函數。希望這可以幫助。

+0

什麼是biggie? –

+1

爲什麼不使用[gmp](https://gmplib.org)之類的東西?這很可能會更加正確和快速。 –

+0

對不起,'biggie'是我用來處理大數字的結構。 'biggie.value'將是一個包含大量數字的字符串。我應該在我的帖子中澄清這一點。 – JaredCubilla

回答

2

由於這是一個學校項目,我會提供一些線索,沒有直接的答案。

對於biggie,您不顯示operator[]。這可能是一個問題;考慮當a長於subtractor時會發生什麼情況。

試試這個測試用例:284 - 86

是從左向右去這樣做減法的最佳方式?