43. 字符串相乘
题目描述
给定两个以字符串形式表示的非负整数 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) {
int n1 = num1.size(), n2 = num2.size();
vector<int> a( n1 ), b( n2 ), c( n1 + n2 );
for ( int i = 0; i < n1; ++i )
a[i] = num1[n1 - i - 1] & 15;
for ( int i = 0; i < n2; ++i )
b[i] = num2[n2 - i - 1] & 15;
for ( int i = 0, j; i < n1; ++i ) {
for ( j = 0; j < n2; ++j ) {
c[i + j] += a[i] * b[j];
c[i + j + 1] += c[i + j] / 10;
c[i + j] %= 10;
}
}
int k = c.size() - 1;
while ( k && !c[k] ) --k;
string ret = "";
while ( k >= 0 ) ret += c[k--] + '0';
return ret;
}
};
/*
时间:4ms,击败:95.57%
内存:6.7MB,击败:90.19%
*/
注意:这里使用的是 十进制 ,即一个位置只保存一个 0~9
范围的数字,也可以使用 万进制 ,即一个位置保存
1
0
8
10^8
108 都行。