43 Multiply Strings
链接:https://leetcode.com/problems/multiply-strings/
问题描述:
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.
Hide Tags Math String
两个数字存在string中,求两个数字的乘积。假设两个数字string是num1,num2。我想到的最直接的做法取num1中每一位数字乘以num2得到积,把所有的积相加就是最后的结果。
class Solution {
public:
string multiply(string num1, string num2)
{
if(num1=="0"||num2=="0")
return "0";
string result="";
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for(int i=0;i<num1.length();i++)
{
string temp="";
int j=0;
while(j++<i)
temp+="0";
temp+=mulstring(num2,num1[i]-'0');
result=addstring(result,temp);
}
reverse(result.begin(),result.end());
return result;
}
string addstring(string num1, string num2)
{
string result="";
int flag=0;
int num;
int i=0;
for(;i<num1.length()&&i<num2.length();i++)
{
num=(num1[i]-'0')+(num2[i]-'0')+flag;
flag=num/10;
result+=num%10+'0';
}
for(;i<num1.length();i++)
{
num=num1[i]-'0'+flag;
flag=num/10;
result+=num%10+'0';
}
for(;i<num2.length();i++)
{
num=num2[i]-'0'+flag;
flag=num/10;
result+=num%10+'0';
}
if(flag!=0)
result+=flag+'0';
return result;
}
string mulstring(string num1,int n)
{
string result="";
int flag=0,num;
for(int i=0;i<num1.length();i++)
{
num=n*(num1[i]-'0')+flag;
flag=num/10;
result+=num%10+'0';
}
if(flag!=0)
result+=flag+'0';
return result;
}
};
还有一种相比而言代码更简单,效率更高的做法。
class Solution {
public:
string multiply(string num1, string num2) {
if(num1=="0" || num2=="0") return "0";
int l1 = num1.length(), l2 = num2.length();
int* n1 = new int[l1];
int* n2 = new int[l2];
int* res = new int[l1+l2];
memset(res,0,sizeof(int)*(l1+l2));
string result = "";
for(int i=0; i<l1; ++i)
n1[i] = num1[i] - '0';
for(int i=0; i<l2; ++i)
n2[i] = num2[i] - '0';
for(int i=0; i<l1; ++i)
for (int j=0; j<l2; ++j)
res[i+j+1] += n1[i]*n2[j];
for (int k=l1+l2-1; 0<k; k--)
{
res[k-1] += res[k]/10;
res[k] %= 10;
result+= res[k]+'0';
}
if(res[0]!=0)
result+=res[0]+'0';
reverse(result.begin(),result.end());
return result;
}
};