BigInt Multiplication w / int数组

时间:2015-11-13 02:51:48

标签: c++ bigint

我正在用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

1 个答案:

答案 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的注意事项,你通过数组的索引看起来显然是不规则的...你从右到左的结果,而从左到右的输入...