给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
思路:这个题目的思路和我们用笔算做两个数相乘的思路是一样的。从后面往前看:第k位=乘数的第1位乘以被乘数的第k位,+乘数的第2位乘以被乘数的第k-1位,+...+, 一直到乘数的第k位乘以被乘数的第1位,代码实现即可,注意进位。
class Solution { public: string reverse(string s){ for (int i = 0; i < s.size() / 2; ++i){//我先把字符串转转置,感觉稍微好写点 swap(s[i], s[s.size() - 1 - i]); } return s; } string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0";//防止出现结果是一堆零的情况 string s, s1 = reverse(num1), s2 = reverse(num2); int c = 0, n1 = s1.size() - 1, n2 = s2.size() - 1; for (int j = 0; j < n1 + n2 + 1; ++j){//两个字符串长度分别为n1和n2,则二者乘积不算最后的进位,长度为n1+n2-1; int temp = c; for (int i = 0; i <= j; ++i){ int a = (i <= n1 ? int(s1[i] - '0') : 0); int b = (j-i <= n2 ? int(s2[j-i] - '0') : 0); temp = temp + a * b; } s = char(temp % 10+'0') + s; c = temp / 10; } if (c!=0) s = char(c+'0') + s;//最后有可能有进位 return s; } };