您的位置:首页 > 其它

Multiply Strings

2015-06-24 17:25 148 查看
算法题目: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.

大致意思:给定两个字符串数字num1,num2,数字可以无限大且非负,求这两个字符数的乘积,以string类型返回

解题思路:用一个长度为num1.size()+num2.size()的字符串ret保存结果,用一个carry数据记录各位上的进位,其长度为两个字符串数的长度和,且初始化为0,对应num1中的第i位上的数和num2上的第j 位数的乘积保存在ret的第i+j位上,最后对进位进行处理。

string multiply(string num1, string num2) {
if(num1.size()==0||num2.size()==0)return "";
else if(num1=="0"||num2=="0")return "0";

string ret(num1.size()+num2.size()-1,'0');
vector<int> carry(num1.size()+num2.size(),0);
for(int i=0;i<num1.size();i++)
{
for(int j=0;j<num2.size();j++)
{
int sum=(num1[i]-'0')*(num2[j]-'0')+ret[i+j]-'0';
ret[i+j]=sum%10+'0';
carry[i+j]+=sum/10;
}
}
for(int i=ret.size()-1;i>=0;i--)
{
int sum=ret[i]-'0'+carry[i+1];
ret[i]=sum%10+'0';
carry[i]+=sum/10;
}

return carry[0]>0?string(1,'0'+carry[0])+ret:ret;

}


另外一种思路,根据乘法运算的步骤做的,计算量较大:

string AddCore(string& s1,string& s2,int c)
{
if(s1.size()==0&&s2.size()==0&&c==0)return "";

int ca=0,cb=0;
string subs1="";
string subs2="";
if(s1.size()!=0)
{
subs1=s1.substr(0,s1.size()-1);
ca=s1[s1.size()-1]-'0';
}

if(s2.size()!=0)
{
subs2=s2.substr(0,s2.size()-1);
cb=s2[s2.size()-1]-'0';
}

int m=(ca+cb+c)%10;
c=(ca+cb+c)/10;

return AddCore(subs1,subs2,c)+string(1,m+'0');
}

string StringAdd(string& s1,string& s2)
{
return AddCore(s1,s2,0);
}

string multiply(string num1, string num2) {
if(num1.size()==0||num2.size()==0)return "";
else if(num1=="0"||num2=="0")return "0";

string ret="";
int zeronum=0;
for(int i=num2.size()-1;i>=0;i--,zeronum++)
{
string s(num1.size(),'0');
int k=num2[i]-'0';
int c=0;
for(int j=num1.size()-1;j>=0;j--)
{
int sum=(num1[j]-'0')*k+c;
c=sum/10;
s[j]=sum%10+'0';
}
if(c>0)s=string(1,'0'+c)+s;
for(int j=0;j<zeronum;j++)
{
s+='0';
}
ret=StringAdd(s,ret);
}
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Multiply Strings