题目描述:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
解题思路:
本来打算按位相乘然后相加的方式计算的,但是看到了一篇博客,感觉这个方法比较简洁,就套用一下了。
计算步骤:
123 *456
A[0]=3*6=18
A[1] =2*6+3*5=27
A[2] =2*5+3*4+6*1=28
A[3]=1*5+4*2=13
A[4]=1*4=4
A[5]=A[6]=…=0
A[0]=8 A[1]=27+1=28
A[1]=8 A[2]=28+2=30
A[2]=0 A[3]=13+3=16
A[3]=6 A[4]=4+1=5
A[4]=5 A[5]=A[6]=…=0
—>A[4]A[3]A[2]A[1]A[0]=56088
AC代码:
class Solution {
public:
string multiply(string num1, string num2)
{
int A[300] = {}, high;
for (int i = 0; i < num1.size(); ++i)
for (int j = 0; j < num2.size(); ++j)
A[num1.size() + num2.size() - i - j - 2] += (num1[i] - '0')*(num2[j] - '0');
string ans;
for (int i = 0; i < 250; ++i)
{
A[i + 1] += A[i] / 10, A[i] %= 10;
if (A[i]) high = i;
}
for (int i = high; i >= 0; --i)
ans += (A[i] + '0');
if (ans.empty()) ans = "0";
return ans;
}
//https://blog.csdn.net/Bendaai/article/details/80117872
};