给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理
解答
Solution 1
将乘法拆解为加法,如num1
的最后一位乘num2
所有,加上num1
倒数第二位乘num2
再乘10
class Solution {
public:
string multiply(string num1, string num2) {
int l1 = num1.length();
int l2 = num2.length();
string result = "";
for(int i=l1-1;i>=0;i--){
int flag = 0;
string temp = "";
for(int j=l2-1;j>=0;j--){
if(num1[i]=='0'){
temp = "0";
break;
}
flag += (num1[i] - '0')* (num2[j] - '0');
temp = char(flag%10+'0')+temp;
flag /=10;
}
if(flag) temp = char(flag+'0') + temp;
if(i==l1-1){
result = temp;
}
else{
if(temp=="0"){
continue;
}
for(int t = i+1;t<l1;t++){
temp = temp + '0';
}
result = add(temp, result);
}
}
return result;
}
string add(string num1, string num2){
string result = "";
int flag = 0;
int l1 = num1.length();
int l2 = num2.length();
int i,j;
i = j = 0;
while(l1||l2||flag){
if(i<l1){
flag += (num1[--l1] - '0');
}
if(j<l2){
flag += (num2[--l2] - '0');
}
result = char(flag%10+'0') + result;
flag = flag / 10;
}
return result;
}
};
Solution 2
num1
的第i
位和num2
的第j
位相乘,应该存在结果的第[i+j, i+j+1]
位上
9 9
9 9
---
0 0 8 1
0 8 1 0
---
0 8 9 1
0 8 1 0
---
1 7 0 1 (按照下列算法,此步是0 17 0 1)
8 1 0 0
---
9 8 0 1
class Solution {
public:
string multiply(string num1, string num2) {
int l1 = num1.length();
int l2 = num2.length();
// n位数和m位数相乘,最多m+n位
char results[l1+l2];
for(int i=0;i<l1+l2;i++)
results[i] = '0';
for(int i = l1-1; i >= 0; --i) {
for(int j = l2-1; j >= 0; --j) {
int temp = (num1[i] - '0') * (num2[j] - '0');
// 处理来自低位的进位
temp += (results[i+j+1] - '0');
// 处理来自同位的进位
results[i+j] = char(results[i+j] + temp/10);
results[i+j+1] = char(temp%10 + '0');
}
}
int i=0;
int l = sizeof(results) / sizeof(results[0]);
while(i<l-1 && results[i]=='0')
i++;
string result = "";
for(;i<l;i++){
result += results[i];
}
return result;
}
};