我正在用C ++做一个BigInt
课作为练习。我目前正在研究乘法功能。我的BigInt
表示为固定长度(非常大)int[]
,每个条目都是输入数字的一个数字。
因此,BigInt = 324
会产生[0,0,0,..,3,2,4]
。
我目前正在尝试使用此代码:
// multiplication
BigInt BigInt::operator*(BigInt const& other) const {
BigInt a = *this;
BigInt b = other;
cout << a << b << endl;
BigInt product = 0;
for(int i = 0; i < arraySize; i++){
int carry = 0;
for(int j = 0; j < arraySize; j++){
product.digits[arraySize - (j + i)] += (carry + (a.digits[j] * b.digits[i]));
carry = (product.digits[arraySize - (j + i)] / 10);
product.digits[arraySize - (j + i)] = (product.digits[arraySize - (j + i)] % 10);
}
product.digits[arraySize - i] += carry;
}
return product;
}
我的回答一直返回0.例如,2 * 2 = 0
。
答案 0 :(得分:1)
我不确定这是否会修复你的程序,但由于这个原因你有Undefined Behavior
:
product.digits[arraySize - (j + i)]
这个索引arraySize - (j + i)
在i + j > arraySize
时变为负数,这显然会出现在你的循环中。
基本上,当将两个数字乘以n个数字时,结果可能会宽达2n个数字。由于您将所有数字编码为固定长度arraySize
,因此您必须采取措施避免超出范围。
一个简单的测试if(i+j) <= arraySize
可以做,或者通过改变第二个循环:
for(int j = 0; j < arraySize - i; j++)
或者,最好使用std::vector
作为BigInt的内部表示。它可以动态调整大小以适应您的结果。
这不完全确定这将完全修复您的代码,但必须修复它,然后才能继续进行调试。移除UB后会更容易。在这里,我批准了@Dúthomhas的注意事项,你通过数组的索引看起来显然是不规则的...你从右到左的结果,而从左到右的输入...