题目:
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note:
- The numbers can be arbitrarily large and are non-negative.
- Converting the input string to integer is NOT allowed.
- You should NOT use internal library such as BigInteger.
思路:
用数组来模拟相乘:第i位的数和第j位的数相乘,则结果的最低位在第(i+j)位,同时考虑进位。假设两个字符串的长度分别为length1和length2,则结果字符串的长度范围为[length1 + length2 - 1, length1 + length2]。在下面的代码实现中,我们仅开辟长度为(length1 + length2 - 1)的数组存储运算结果,而将最后一位的值用flag来表示。在返回最终运算结果之前,需要处理一个乘积为0的corner case。
代码:
class Solution {
public:
string multiply(string num1, string num2) {
int length1 = num1.size(), length2 = num2.size(), flag = 0;
vector<int> sum(length1 + length2 - 1, 0);
for(int i = length1 - 1; i >= 0; i--)
for(int j = length2 - 1; j >= 0; j--)
sum[i+j] += (num1[i] - '0') * (num2[j] - '0');
for(int i = length1 + length2 - 2; i >= 0; i--)
{
int val = (flag + sum[i]) % 10;
flag = (flag + sum[i]) / 10;
sum[i] = val;
}
string ans = flag ? to_string(flag) : ""; // the range of flag is [0, 9]
for(auto val : sum)
ans += to_string(val);
return ans[0] == '0' ? "0" : ans;
}
};