5

重複の可能性:
非常に大きな数の除算

30個のshortの配列として単純に定義されている2つのHugeIntオブジェクトを処理するには、/演算子をオーバーロードする必要があります。これは宿題ですが、私はこの問題について何日も頭を悩ませてきました。

私はすでに*演算子をオーバーロードしました:

HugeInt HugeInt::operator*(const HugeInt &op2){
HugeInt temp;
short placeProducts[hugeIntSize + 1][hugeIntSize] = {0};
short product;
int carry = 0;
int k, leftSize, rightSize, numOfSumRows;

leftSize = getDigitLength();
rightSize = op2.getDigitLength();

if(leftSize <= rightSize) {

    numOfSumRows = leftSize;

    for(int i = (hugeIntSize - 1), k = 0; k < numOfSumRows; i--, k++) {

        for(int j = (hugeIntSize - 1); j >= k; j--) {

            product = integer[i] * op2.integer[j] + carry;

            if (product > 9) {

                carry = product / 10;

                product %= 10;

            } else {

                carry = 0;
            }
            placeProducts[k][j - k] = product;
        }
    }

} else {
    numOfSumRows = rightSize;

    for(int i = (hugeIntSize - 1), k = 0; k < numOfSumRows; i--, k++) {

        for(int j = (hugeIntSize - 1); j >= k; j--) {

            product = integer[j] * op2.integer[i] + carry;

            if (product > 9) {

                carry = product / 10;

                product %= 10;

            } else {

                carry = 0;
            }
            placeProducts[k][j - k] = product;
        }
    }
}
sumProductsArray(placeProducts, numOfSumRows);

for(int i = 0; i < hugeIntSize; i++)
{
    temp.integer[i] = placeProducts[hugeIntSize][i];
}

return temp;}

しかし、どうすれば/ opをオーバーロードできますか?私の主な問題は、C ++コードや構文ではなく、分割するアルゴリズムにあります。私が掛けるとき、私はそれを一桁ずつすることができます。各製品(つまり、下の1桁の数字に上のすべての桁を掛け、次にキャリーアルゴリズムを使用して数字ごとに10桁の時間を掛ける)を2次元配列に格納します。新しい製品を入手するたびに、それはn + 1だけ左にオフセットされ、必要な10の累乗で「乗算」されます。次に、すべての列を合計します。

筆算法をコーディングする方法を一生理解することはできません。私は2つの配列を扱っているので、1桁ずつである必要があり、乗算アルゴリズムを逆にするのと同じくらい簡単かもしれないと思います。ネストされたループと減算?商とリマインダーの変数が必要ですか?より良い方法はありますか?私は正しい方向に向けられる必要があります。

4

1 に答える 1

2

整数の計算除算では、いくつかの興味深い結果があります。

  • 分子<分母は商=0を意味します
  • 分子==分母は商=1を意味します
  • 分子>分母、商を決定するには筆算が必要になります。

最初の2つの条件は、forループで満たすことができます。この動作をカプセル化するために、より小さい関係演算子と等しい関係演算子をオーバーロードできます。

筆算の場合、乗算演算子、オーバーロードされた小なり演算子、減算演算子、および演算を実行するための桁メンバー関数の追加が必要になります。

それはブルートフォースですが、仕事を成し遂げる必要があります。

于 2012-10-13T03:17:43.410 に答える