My method which is a little redundant
class Solution {
public:
string multiply(string num1, string num2) {
if(num1[0]=='0'||num2[0]=='0')
return "0";
string res="0";
int num_zero=0;
for(int i=num2.size()-1;i>=0;i--)
{
string temp;
temp=multiply_helper(num1,num2[i]);
for(int j=0;j<num_zero;j++)
temp+='0';
num_zero++;
res=add(res,temp);
}
return res;
}
string multiply_helper(string num,char single)
{
if(single=='0')
return "0";
string res;
int c_in=0;
for(int i=num.size()-1;i>=0;i--)
{
int temp=(num[i]-'0')*(single-'0')+c_in;
res+=(temp%10+'0');
c_in=temp/10;
}
if(c_in)
res+=c_in+'0';
reverse(res.begin(),res.end());
return res;
}
string add(string num1,string num2)
{
string res;
int i=num1.size()-1,j=num2.size()-1,c_in=0;
while(i>=0&&j>=0)
{
int temp=(num1[i]-'0')+(num2[j]-'0')+c_in;
res+=temp%10+'0';
c_in=temp/10;
i--;
j--;
}
if(i<0&&j<0)
{
if(c_in)
res+=c_in+'0';
reverse(res.begin(),res.end());
return res;
}
if(i<0)
{
while(j>=0)
{
int temp=c_in+num2[j]-'0';
res+=temp%10+'0';
c_in=temp/10;
j--;
}
if(c_in)
res+=c_in+'0';
reverse(res.begin(),res.end());
}
else if(j<0)
{
while(i>=0)
{
int temp=c_in+num1[i]-'0';
res+=temp%10+'0';
c_in=temp/10;
i--;
}
if(c_in)
res+=c_in+'0';
reverse(res.begin(),res.end());
}
return res;
}
};
Update version which is much cleaner
class Solution {
public:
string multiply(string num1, string num2) {
int len1=num1.length();
int len2=num2.length();
string res;
for(int i=0;i<len1+len2;i++)
res.push_back('0');//make the result a biggest length
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for(int i=0;i<len1;i++)
{
int carry=0;
int j;
for(j=0;j<len2;j++)
{
int num=(num1[i]-'0')*(num2[j]-'0')+res[i+j]-'0'+carry;//add the digit directly to the result
carry=num/10;
res[i+j]=num%10+'0';
}
if(carry)
res[i+j]=carry+'0';
}
while(res.size()>1&&res.back()=='0')//there might be redundant 0s
res.pop_back();
reverse(res.begin(),res.end());
return res;
}
};