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.
这道题思路很简单,根据乘法的算法,嵌套循环。
class Solution {
public:
string multiply(string num1, string num2) {
string n1,n2;
string sum(num1.size()+num2.size()+1,'0');
int count=0;
int n=0;
//尽量让长度短的作为乘数
if(num1.size()<num2.size()) {
n1=num2;
n2=num1;
}else{
n1=num1;
n2=num2;
}
//颠倒字符串的字符顺序,使得循环的第一位作为低位
reverse(n1.begin(),n1.end());
reverse(n2.begin(),n2.end());
for(int i=0;i<n2.size();i++){
int k2=n2[i]-'0';
count=0;
for(int j=0;j<n1.size();j++){
int k1=n1[j]-'0';
int tmp=sum[i+j]-'0';
int sum_cur=tmp+count+k2*k1;
count=sum_cur/10;
sum[i+j]=sum_cur%10+'0';
}
//每以一位乘数遍历完被乘数所有位数,此时若count不为0,则要将其加到sum的下一位里面
sum[i+n1.size()]=count+'0';
}
//获得结果后,要将sum中字符的顺序颠倒过来,得到正确的数值顺序。
reverse(sum.begin(),sum.end());
//获取第一个不是0的索引,如果获取失败,则返回npos
int p=sum.find_first_not_of('0');
//字符串全都是0的情况,此时返回“0”
if(sum.find_first_not_of('0')==string::npos) return "0";
//否则找到不是0的第一位,并利用substr函数复制子字符串,要求从指定位置开始,并具有指定的长度
else return sum.substr(p,sum.size());
}
};