题目 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
思路
最开始能想到的简单思路就是模拟乘法运算。例如123乘456,就可以模拟成:
123 * 6 + 123 * 50 + 123 * 400
这样模拟一个很重要的原因就是不准用大数类型,那么要自己写相乘和相加,时间复杂度为O(n·m),n和m为字符串的长度。
然后看了看官解有没有优化,思路和这个模拟思路是没有什么差别的,但是官解使用数组来存储运算结果,这样的话就不用写大数类型相加了,主要是可以降低代码复杂度。
代码实现
class Solution {
public:
string multiply(string num1, string num2) {
vector<char> sum(num1.size() + num2.size(), '0');
for (int i = num1.size() - 1; i >= 0; i--) {
int n1 = num1[i] - 48;
int jinwei = 0;
for (int j = 0; j < num2.size(); j++) {
int n = n1 * (num2[num2.size() - j - 1] - 48) + jinwei;
int m = sum[i + num2.size() - j] - 48;
n += m;
sum[i + num2.size() - j] = (n % 10) + 48;
jinwei = n / 10;
}
int pos = i;
while (jinwei) {
int n = sum[pos] - 48;
n += jinwei;
jinwei = n / 10;
sum[pos] = n + 48;
pos--;
}
}
string answer;
int count = 0;
while (count < sum.size() && sum[count] == '0') {
count++;
}
if (count == sum.size()) {
return "0";
}
while (count < sum.size()) {
answer += sum[count++];
}
return answer;
}
};
代码双85左右,还行吧。主要是进位问题,比如前一位运算后得到的是9999,此时加了一个3进来,那么会造成不断循环的进位,这个进位的处理是比较需要注意的。