题目:Given two numbers represented as strings, return multiplication of the numbers as a string.
思路:重新编写乘法、加法函数
尤其注意究竟是数字操作还是字符本身操作,在好几个地方被卡主,都是保存为string的时候没有能够保存正确。
本题的思路遵循常见乘法思路:超过一位的两数相乘,把位数小的作为乘数,按照位数小的数,按位相乘。
程序的一个技巧就是,每每计算一次,就使得zeros后面添加一个0,这样移到下一位的时候就不需要额外的乘以10,而且还是字符串的形式。
但是最重要的就是编写字符串相乘函数,字符串相加函数,主要考虑相乘相加进位因素。
代码:
class Solution {
public:
//https://leetcode.com/problems/multiply-strings/
string addBig(string num1,string num2){
int m=num1.size(),n=num2.size();
if(m<n){
swap(num1,num2);
swap(m,n);
}
int flag=0,i=m-1,j=n-1;
int a=0;
while(i>=0){
if(i>=0){
a+=num1[i]-'0'+flag;
}
if(j>=0){
a+=num2[j--]-'0';
}
flag=a/10;
num1[i--]=(a)%10+'0';a=0;
}
if(flag>0){
num1.insert(num1.begin(),flag+'0');
}
/*
int a = 0, i=m-1, j=n-1;
while (i >= 0) {
int x = a;
if (i >= 0)
x += num1[i--] - '0';
if (j >= 0)
x += num2[j--] - '0';
num1[i+1] = x % 10 + '0';
a = x / 10;
}
if (a > 0)
num1.insert(num1.begin(), '1');
*/
return num1;
}
string multiplySingleNumber(string num,char c){
string result;
int flag=0;
if(c=='0') {
return "0";
}
for(int i=num.length()-1;i>=0;i--){
int a=(num[i]-'0')*(c-'0')+flag;
num[i]=(a)%10+'0';
flag=a/10;
}
if(flag>0){
num.insert(num.begin(),flag+'0');
}
return num;
}
string multiply(string num1, string num2) {
int m=num1.size();
int n=num2.size();
if(m<n){
swap(m,n);
swap(num1,num2);
}
string result,zeros;
result="0";
for(int i=n-1;i>=0;i--){
if(num2[i]!='0'){
string s=multiplySingleNumber(num1,num2[i]);
s+=zeros;
result=addBig(s,result);
}
zeros.append(1,'0');
}
/*for(int i=n-1;i>=0;i--){
if(num2[i]!='0'){
zeros=multiplySingleNumber(num1,num2[i]);
zeros.append(n-1-i,'0');
result=addBig(zeros,result);
}
}*/
while((int)result.size()>1&&result[0]=='0'){
result.erase(result.begin());
}
return result;
}
};