原题目链接
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
直接实现
虽然提示不要使用字符串转换为整数计算,但还是尝试了一下…
class Solution {
public:
string multiply(string num1, string num2) {
long long int l1 = atoi(num1.c_str());
long long int l2 = atoi(num2.c_str());
string res = std::to_string(l1 * l2);
return res;
}
};
不多说,好好做题。
题目分析
不能转化为整型计算,且输入为字符串,很自然地想到用ASCII码的差值表示数字。
得到“数字“之后,如何计算呢?
一种思路是,建立一个大的缓冲区,然后对应位置相乘…这样思路不错,但实现会很复杂,因为每一句判断条件,都需要多行代码实现(挖个坑,先留着,以后填)。
还有一种思路,就是模拟手写的竖式乘法:
Celia的回答 描述的很详细,很有启发。
解题分析
代码中注释
代码实现
class Solution {
public:
string multiply(string num1, string num2) {
int l1 = num1.size();
int l2 = num2.size();
string ans(l1 + l2, '0'); //初始化为'0'
for (int i = l1 - 1; i >= 0; --i)
{
for (int j = l2 - 1; j >= 0; --j)
{
int sum = (ans[i + j + 1] - '0') + (num1[i] - '0') * (num2[j] - '0');
ans[i + j + 1] = (sum % 10) + '0'; //当前位
ans[i + j] += sum / 10; //前一位加上进位,res[i+j]已经初始化为'0',加上int类型自动转化为char,所以此处不加'0'
}
}
for (int i = 0; i < ans.size(); ++i)
{
if (ans[i] != '0' || i == ans.size() - 1)
return ans.substr(i);
}
return "";
}
};
复杂度分析:
- 时间复杂度:O(MN)——>O(N^2)
- 空间复杂度:O(M+N)——>O(N)
写在最后
还有一些没有写清楚,先到这里。