这个问题已经在这里有了答案:
已关闭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的幂。然后,我将所有列求和。
我一辈子都想不出如何编码长除法。由于我要处理两个数组,因此必须逐个数字地处理,我怀疑这可能与逆转乘法算法一样容易。嵌套循环和减法?我需要一个用于商和提醒的变量吗?有没有更好的方法?我只需要指出正确的方向。
最佳答案
在整数的计算除法中,有一些有趣的结果:
前两个条件可以通过for循环来满足。您可以重载小于和等于关系运算符以封装此行为。
对于长除法,您将需要您的乘法运算符以及重载的小于和减法运算符,以及一个附加数字成员函数来执行该操作。
这是蛮力的,但应该完成工作。