21xrx.com
2025-03-29 20:27:42 Saturday
文章检索 我的文章 写文章
C++ 实现大数乘法
2023-07-12 06:02:24 深夜i     16     0
C++ 大数 乘法 实现 精度

在编程中,有时候需要对比较大的数字进行乘法运算,但是很多编程语言的整数类型都有一定的上限,不能满足这种操作。C++ 作为一种支持高精度计算的语言,提供了多种实现大数乘法的方法。

一种比较简单的实现方法是将大数转换成字符串,然后按位进行乘法计算。具体来说,可以定义一个字符串类来存储大数,重载乘法运算符,实现按位乘法。具体实现代码如下:


#include <iostream>

#include <string>

using namespace std;

class BigNumber {

public:

  string n;

  BigNumber(string num) : n(num) {}

  BigNumber operator*(const BigNumber& b) {

    string num1 = n, num2 = b.n;

    if (num1 == "0" || num2 == "0")

      return BigNumber("0");

    int len1 = num1.length(), len2 = num2.length();

    string ans(len1 + len2, '0');

    for (int i = len1 - 1; i >= 0; i--) {

      int carry = 0;

      for (int j = len2 - 1; j >= 0; j--) {

        int temp = (num1[i] - '0') * (num2[j] - '0') + carry + (ans[i+j+1] - '0');

        ans[i+j+1] = (temp % 10) + '0';

        carry = temp / 10;

      }

      ans[i] += carry;

    }

    while (ans[0] == '0')

      ans.erase(0, 1);

    return BigNumber(ans);

  }

};

int main() {

  string num1 = "123456789123456789", num2 = "987654321987654321";

  BigNumber b1(num1), b2(num2);

  BigNumber ans = b1 * b2;

  cout << ans.n << endl; // 输出 121932631137021795684706145890987121

  return 0;

}

这里首先定义一个字符串类 BigNumber,用来存储大数。在乘法操作中,将两个大数转换成字符串,然后按位进行乘法计算。具体来说,从最低位开始逐位相乘,将每一位的结果加到对应位上,然后进行进位。最后去掉前导零,返回结果。

需要注意的是,在乘法计算中,需要预留一位来处理进位情况,因此在定义计算结果字符串时,需要给字符串预留一个长度为 len1 + len2 的空间。

此外,为了方便理解,上面的代码中使用了简单的符号重载操作。在实际使用中,也可以使用函数来实现相同的操作。总之,这种方法虽然比较简单,但是需要进行多次字符串转换操作,效率不如其他的方法。

除了按位乘法,对大数进行分治运算也是一种常见的实现方法。具体来说,将大数分成若干小部分,然后对每一部分进行单独的乘法运算,最后将结果合并起来即可。这种方法能够有效地提高计算效率,但是对算法的要求也更高。

总之,C++ 提供了多种实现大数乘法的方法,开发者可以根据实际需求选择不同的实现方式。在进行大数计算时,了解不同的实现方法,可以有效地提高计算效率和程序的实用性。

  
  

评论区

请求出错了