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 {
private:
void reverse(string& s)
{
int l=0;
int r=s.length()-1;
while(l<r)
{
char c=s[l];
s[l]=s[r];
s[r]=c;
l++;
r--;
}
}
void add(string& s1,string s2)
{
while(s1.length()<s2.length()) s1=s1+'0';
while(s2.length()<s1.length()) s2=s2+'0';
int add=0;
for(int i=0;i<s1.length();i++)
{
int sum=add+s1[i]+s2[i]-'0'-'0';
s1[i]=sum%10+'0';
add=sum/10;
}
if(add>0) s1=s1+char(add+'0');
}
void mul(string& s,int n)
{
int add=0;
for(int i=0;i<s.length();i++)
{
int sum=(s[i]-'0')*n+add;
s[i]=sum%10+'0';
add=sum/10;
}
if(add>0) s=s+char('0'+add);
}
void fix(string& s)
{
if(s.length()==0) s="0";
int index=s.length()-1;
while(index>0 && s[index]=='0') index--;
string result;
for(int i=0;i<=index;i++)
result=result+s[i];
s=result;
}
public:
string multiply(string num1, string num2)
{
reverse(num1);
reverse(num2);
string result;
string tens;
for(int i=0;i<num2.length();i++)
{
string num=num1;
mul(num,num2[i]-'0');
num=tens+num;
add(result,num);
tens=tens+'0';
}
fix(result);reverse(result);
return result;
}
};
private:
void reverse(string& s)
{
int l=0;
int r=s.length()-1;
while(l<r)
{
char c=s[l];
s[l]=s[r];
s[r]=c;
l++;
r--;
}
}
void add(string& s1,string s2)
{
while(s1.length()<s2.length()) s1=s1+'0';
while(s2.length()<s1.length()) s2=s2+'0';
int add=0;
for(int i=0;i<s1.length();i++)
{
int sum=add+s1[i]+s2[i]-'0'-'0';
s1[i]=sum%10+'0';
add=sum/10;
}
if(add>0) s1=s1+char(add+'0');
}
void mul(string& s,int n)
{
int add=0;
for(int i=0;i<s.length();i++)
{
int sum=(s[i]-'0')*n+add;
s[i]=sum%10+'0';
add=sum/10;
}
if(add>0) s=s+char('0'+add);
}
void fix(string& s)
{
if(s.length()==0) s="0";
int index=s.length()-1;
while(index>0 && s[index]=='0') index--;
string result;
for(int i=0;i<=index;i++)
result=result+s[i];
s=result;
}
public:
string multiply(string num1, string num2)
{
reverse(num1);
reverse(num2);
string result;
string tens;
for(int i=0;i<num2.length();i++)
{
string num=num1;
mul(num,num2[i]-'0');
num=tens+num;
add(result,num);
tens=tens+'0';
}
fix(result);reverse(result);
return result;
}
};