您的位置:首页 > 其它

Leetcode: Multiply Strings

2013-10-27 23:34 393 查看
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.
方法一:模拟手算乘法

string addTwoString(string num1, string num2)
{
int len1 = num1.size()-1;
int len2 = num2.size()-1;
bool carry = false;
string res = "";
while(len1 >=0 && len2 >=0)
{
int a = num1[len1]-'0';
int b = num2[len2]-'0';
int c = a+b;
if(carry)
{
c+=1;
carry=false;
}
if(c>9)
{
carry=true;
c -= 10;
}
char tmp = '0'+c;
res = tmp + res;
len1--;
len2--;
}
string pre="";
if(len1>=0)
pre=num1.substr(0,len1+1);
else if(len2>=0)
pre=num2.substr(0,len2+1);
if(carry){
int sz=pre.size()-1;
while(sz>=0 && pre[sz]=='9')
{
pre[sz]='0';
sz--;
}
if(sz<0)
pre='1'+pre;
else
pre[sz]+=1;
}
res = pre+res;
return res;
}
string multiplyOneBit(string num1, int num2)
{
int len = num1.size();
int* res = new int[len+1];
memset(res,0,sizeof(int)*(len+1));

for(int i=len;i>0;i--)
{
res[i] += (num1[i-1]-'0')*num2;
res[i-1] += res[i]/10;
res[i] %= 10;
}
string ss="";
for(int i=0; i<=len; i++)
ss += char('0' + res[i]);
return ss;
}
string multiply(string num1, string num2) {
// Note: The Solution object is instantiated only once.
if(num1=="0" || num2=="0") return "0";
int l1 = num1.length(), l2 = num2.length();
string res="";
for(int i =0; i< l2;i++)
{
res+='0';
string tmp = multiplyOneBit(num1,num2[i]-'0');
res = addTwoString(res,tmp);
}
res = res[0]=='0'? res.substr(1):res;
return res;
}


方法二:

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));
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];

string ss = "";
for (int k=l1+l2-1; k>=0; --k){
if(k>0) res[k-1] += res[k]/10;
res[k] %= 10;
ss = char(res[k]+'0')+ss;
}
ss = ss[0]=='0'? ss.substr(1):ss;
//return ss.empty()?"0":ss;
return ss;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息