HugeInt的重载除法运算符

时间:2012-10-13 00:41:00

标签: c++ algorithm math division

  

可能重复:
  Division with really big numbers

我需要重载/运算符来处理两个HugeInt对象,这些对象被简单地定义为30个短裤的数组。这是家庭作业,顺便说一下,但是我已经在这个问题上花了好几天的时间。

我已经重载了*运算符:

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位数字时间)。每次我得到新产品时,它都会向左偏移n + 1,它会将它“乘以”所需的10次幂。然后我只是总结所有列。

我不能为我的生活弄清楚如何编码长除法。因为我正在处理两个数组,所以它必须是逐位的,我怀疑它可能像反转乘法算法一样容易。嵌套循环和减法?我需要一个商数和提醒变量?有更好的方法吗?我只需指出正确的方向。

1 个答案:

答案 0 :(得分:2)

在整数的计算划分中,有一些有趣的结果:

  • 分子&lt;分母意味着商= 0
  • numerator == denominator暗示quotient = 1
  • numerator&gt;分母,需要长分来确定商。

for循环可以满足前两个条件。您可以重载less-than和equals关系运算符来封装此行为。

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

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