这个问题已经在这里有了答案:




已关闭8年。






我需要重载/运算符以处理两个简单定义为30个短裤的数组的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++代码或语法,而是我的除法算法。当我乘以倍数时,我就能做到。我在我的2d数组中存储每个乘积(也就是使用我的进位算法将上面每个数字的底数乘以1的位数,然后将上面每个数字的10位数的乘积)存储在2d数组中。每次获得新乘积时,它都会向左偏移n +1,这会将其乘以所需的10的幂。然后,我将所有列求和。

我一辈子都想不出如何编码长除法。由于我要处理两个数组,因此必须逐个数字地处理,我怀疑这可能与逆转乘法算法一样容易。嵌套循环和减法?我需要一个用于商和提醒的变量吗?有没有更好的方法?我只需要指出正确的方向。

最佳答案

在整数的计算除法中,有一些有趣的结果:

  • 分子
  • 分子==分母表示商= 1
  • 分子>分母,需要长除法才能确定商。

  • 前两个条件可以通过for循环来满足。您可以重载小于和等于关系运算符以封装此行为。

    对于长除法,您将需要您的乘法运算符以及重载的小于和减法运算符,以及一个附加数字成员函数来执行该操作。

    这是蛮力的,但应该完成工作。

    08-26 16:54
    查看更多