43. 字符串相乘
难度中等828
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3"输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"输出: "56088"
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
思路
- 模拟手算乘法的过程
- 计算num1的每一位数字与num2的乘积,分别存入temp[i]
- 将temp中的字符串进位,如nums[i]与num2相乘的结果temp,temp*10^i
- 累加,将temp全部加起来
代码
class Solution {
public:
string multiply(string num1, string num2) {
if(num1[0]=='0'||num2[0]=='0')
return "0";
int i,j,n,m,p=0,q,flag=0;
n=num1.size();
m=num2.size();
string s,temp[n];
char t;
for(i=n-1;i>=0;i--)//计算num1的每一位数字与num2的乘积,分别存入temp[i]
{
p=0;
for(j=m-1;j>=0;j--)
{
p=(num1[i]-48)*(num2[j]-48)+p;
q=p%10;
p=p/10;
temp[i]+=(q+48); //累加
}
if(p&&j==-1)
temp[i]+=(p+48);
}
for(i=n-1;i>=0;i--)//将temp中的字符串进位,如nums[i]与num2相乘的结果temp,temp*10^i
{
flag=n-1-i;//进位
while(flag--)
temp[i]="0"+temp[i];
}
s=temp[0];
for(i=1;i<=n-1;i++)//累加,将temp全部加起来
{
p=0;
for(j=0;j<temp[i].size();j++)
{
p=(s[j]-48)+(temp[i][j]-48)+p;
q=p%10;
p=p/10;
s[j]=(q+48); //累加
}
while(p)
{
if(j<s.length())
{
p=(s[j]-48)+p;
q=p%10;
p=p/10;
s[j]=(q+48); //累加
}
if(j>=s.length())
{
q=p%10;
p=p/10;
s+=(q+48);
}
j++;
}
}
for(i=0;i<s.length()/2;i++)//字符串翻转
{
t=s[i];
s[i]=s[s.length()-1-i];
s[s.length()-1-i]=t;
}
return s;
}
};