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.
这个题目看似是两个数的乘法,但我们并不能通过转换类型的方式来直接乘,因为用字符串存储是不存在位数限制的。因此只能做字符串单个位的处理。我用加法模拟乘法的方法,先求出num2中每一位数字与num1相乘的结果,然后再把这个结果累加到result中,代码如下:
class Solution {
public:
string multiply(string num1, string num2) {
string result="0";
if(num1=="0" || num2=="0") //有0直接返回
return result;
char c;
for(int i=num2.size()-1;i>=0;i--){
int m=num2[i]-'0';
string s=mul(num1,m);
//相加前确定该结果所在的位置,在后面补0
for(int j=i+1;j<num2.size();j++)
s=s+'0';
result=sum(result, s);
}
return result;
}
string mul(string s1, int n){ //单个数字与num1字符串相乘
int carry=0; //进位标志
string sout;
for(int i=s1.size()-1;i>=0;i--){
int tmp=s1[i]-'0';
int m=tmp*n+carry;
carry=m/10;
m=m%10;
char c='0'+m;
sout=c+sout;
}
if(carry>0){
char f='0'+carry;
sout=f+sout;
}
return sout;
}
string sum(string s1, string s2){ //结果累加
//把s1和s2字符串的位数补成相同,短的字符串前面补0
while(s1.size()<s2.size()){
s1='0'+s1;
}
while(s2.size()<s1.size()){
s2='0'+s2;
}
int carry=0; //进位标志
string sout;
for(int i=s1.size()-1;i>=0;i--){
int tmp1=s1[i]-'0';
int tmp2=s2[i]-'0';
int tsum=tmp1+tmp2+carry;
carry=tsum/10;
tsum=tsum%10;
char c='0'+tsum;
sout=c+sout;
}
if(carry>0){
char f='0'+carry;
sout=f+sout;
}
return sout;
}
};