给定两个以字符串形式表示的非负整数 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) {
if (num1 == "0" || num2 == "0")return "0";
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int s1 = num1.size(), s2 = num2.size();
vector<int>ans(s1 + s2);//vector初始化方式
//模拟竖式乘法过程,用数组保存每个结果,最后处理进位
for (int i = 0; i < s1; i++) {
for (int j = 0; j < s2; j++) {
//这注意,每次结果是累加起来
ans[i + j]+= (num1[i]-'0') *( num2[j]-'0');
}
}
//处理进位
for (int i = 0; i < s1+s2; i++) {//一开始写成了只有s1
if (ans[i] > 9) {
int t = ans[i];
ans[i] = t % 10;
ans[i + 1] += (t / 10);//注意这是累加起来
}
}
//检查一下最后一位有没有进位,也就是说两位数相乘看看结果是三位还是四位
int pos = ans[s1 + s2 - 1] == 0 ? s1 + s2 - 2: s1 + s2 - 1;
//将最后结果输出
string res= "";
for (; pos >= 0; --pos)
res += (to_string(ans[pos]));
return res;
}
};
int main() {
string nums1 = "123";
string nums2 = "456";
Solution solution;
string res = solution.multiply(nums1,nums2);
return 0;
}
思路: