HugeInt的除法运算符过载

Overloaded division operator for HugeInt

本文关键字:运算符 除法 HugeInt      更新时间:2023-10-16

可能的重复:
具有大数字的除法

我需要重载/运算符来处理两个HugeInt对象,这两个对象被简单地定义为30个short的数组。顺便说一句,这是家庭作业,但我已经为这个问题绞尽脑汁好几天了。

我已经超载了*操作员:

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位数乘以上面的每个数字,然后是上面的每个num的10位数)存储在我的2d数组中。每次我得到新的乘积,它都会向左偏移n+1,这将它"乘以"所需的10次方。然后我把所有的列加起来。

我一辈子都想不出如何对长除法进行编码。由于我处理的是两个数组,所以它必须是一个数字接一个数字的,我怀疑这可能和反转乘法算法一样容易。嵌套循环和减法?我需要一个变量作为商和提醒?有更好的方法吗?我只需要被指向正确的方向。

在整数的计算除法中,有几个有趣的结果:

  • 分子<分母表示商=0
  • 分子==分母表示商=1
  • 分子>分母,则需要进行长除法来确定商

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

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

这是蛮力,但应该完成任务。