📜  将大数相乘表示为字符串(1)

📅  最后修改于: 2023-12-03 15:25:17.537000             🧑  作者: Mango

将大数相乘表示为字符串

在我们进行大数相乘时,若使用int或者long long等数据类型,则不可避免地会出现溢出的情况,因此,我们不得不寻找一种更加高效而且避免溢出的方法来进行大数相乘。一种可行的解决方法是将大数表示为字符串,然后对字符串进行处理。

算法思路

假设两个大数分别为num1和num2,则我们先将num1与num2的每一位进行相乘,得到一个二维数组save,其中save[i+j]用来存储num1的第i位与num2的第j位的积;接下来,我们考虑将二维数组save合并为一个字符串res,具体的合并方法如下:

  • 首先,我们从低位到高位依次读取二维数组save中的每一位;
  • 将当前位与res中对应的位相加,并额外考虑进位的情况;
  • 将当前位的结果以及进位情况更新至res中对应的位。

最后,我们需要将字符串res中前导0的位置去掉,并将负号设定好。

代码实现

下面是一份使用C++语言实现的大数相乘的代码实现:

string multiply(string num1, string num2) {
    int m = num1.size(), n = num2.size();
    vector<int> res(m + n);
    
    for(int i = m - 1; i >= 0; i--) {
        for(int j = n - 1; j >= 0; j--) {
            int a = num1[i] - '0', b = num2[j] - '0';
            int sum = a * b + res[i + j + 1];
            res[i + j + 1] = sum % 10;
            res[i + j] += sum / 10;
        }
    }
    
    string str;
    int i = 0;
    while(i < m + n && res[i] == 0) {
        i++;
    }
    if(i == m + n) {
        return "0";
    }
    while(i < m + n) {
        str += to_string(res[i++]);
    }
    return str;
}

该算法的时间复杂度为O(m * n),其中m和n分别表示num1和num2的长度,时间复杂度较小,因此可以用来求解大数相乘问题。