2017-06-04 10 views
-1

私は比較的新しいC++です。文字列のような数字を扱うbiggieという構造体を使用して、大きな数値を扱うことができる算術関数のセットを作成しようとしています。私は現在減算機能に問題があります。大きな数の減算との不一致

私は小さな数字で試し引きを実行すると、正常に動作します。スケールアップしようとすると、初めて関数を呼び出すときに正常に動作します。

2回目に大きな数字を呼び出すと、後で2つの大きな数字の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)); 
} 

私はプログラムを実行すると、私が一度得た出力でした(すべてが完全ですex 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[]は表示されません。これは問題になる可能性があります。 asubtractorより長い場合、何が起こるかを検討してください。

は、このテストケースを試してみてください:284 - 86

左から右減算をやって行くための最善の方法?

関連する問題