给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
题目分析:如果两个字符串中有一个为0,则结果是0;否则的话,将其中一个数A的最末位(即个位)和另一个数B相乘,将结果保存到ans数组中去,然后将A的十位与B相乘,将结果累加到ans中去,然后将A的百位与B相乘,加到ans中去……,这里加的时候每次要向后移一位。最后,规范化ans数组,即把数值超过10的那一位向后进一位,使得每位上的值都在0~9之间,最后输出ans即可。
代码展示:
class Solution {
public:
string multiply(string num1, string num2) {
if(num1=="0"||num2=="0")
return "0";
int numA[110],numB[110];
for(int i=0;i<num1.length();i++)
numA[i] = num1[i]-'0';
for(int i=0;i<num2.length();i++)
numB[i] = num2[i]-'0';
int ans[250];
memset(ans,0,sizeof(int)*250);
for(int i=num1.length()-1;i>=0;i--){
int carry = 0; //表示进位
for(int j=num2.length()-1;j>=0;j--){
ans[num1.length()-1-i+num2.length()-1-j] += (numA[i]*numB[j]+carry)%10;
carry = (numA[i]*numB[j]+carry)/10;
if(j==0)
ans[num1.length()-1-i+num2.length()-1+1] = carry;
}
}
for(int i=0;i<249;i++){
if(ans[i]>=10){
ans[i+1] += ans[i]/10;
ans[i] = ans[i]%10;
}
}
string str = "";
bool flag = false;
for(int i=249;i>=0;i--){
if(ans[i]!=0 || flag){
str += char(ans[i]+'0');
flag = true;
}
}
return str;
}
};