您的位置:首页 > 其它

Multiply Strings

2013-04-08 22:24 169 查看
经典的大数相乘算法,先试着在纸上写了一遍,发现勾来划去简直没法看啊,跟个草稿纸一样,要在面试时这么写,估计马上就跪了。看来算法一旦复杂一点在纸上写的功力就差很多啊!!

贴一份自己写的代码吧,主要是模拟人做乘法:

发现可读性也不好,变量的使用和命名乱起八糟的。。。。。。。。。

string multiply(string num1,string num2)
{
int len1=num1.length(),len2=num2.length();
if (len1==0||len2==0)
return "0";
bool isNeg1=false,isNeg2=false;
int head1=0,head2=0,tail1=len1-1,tail2=len2-1;
if ( num1[0]=='+' || num1[0]=='-')
{
isNeg1=num1[0]=='-';
head1++;
}
if ( num2[0]=='+' || num2[0]=='-')
{
isNeg2=num2[0]=='-';
head2++;
}

string res=string(len1+len2+2,'0');
int tailr=res.length()-1;
int pNum1=tail1,pNum2=tail2,pCur=tailr;
while(pNum2>=head2)
{
pCur=tailr;
pNum1=tail1;
int carry=0;
while(pNum1>=head1)
{
int times=(num1[pNum1]-'0')*(num2[pNum2]-'0')+carry+res[pCur]-'0';
res[pCur]=times%10+'0';
carry=times/10;
pNum1--;
pCur--;
}
while(carry)
{
int tmp=carry+res[pCur]-'0';
res[pCur]=tmp%10+'0';
carry=tmp/10;
pCur--;
}
tailr--;
pNum2--;
}

int unused=0;
int i=0;
int lenRes=res.length();
for(i=0;i<lenRes;i++)
{
if (res[i]>'0')
{
break;
}
else
unused++;
}
if ( i==lenRes)  //all '0'
return "0";
else
{
string ans;
if ( (isNeg1&&!isNeg2)||(!isNeg1&&isNeg2))
ans.push_back('-');
for(int i=unused;i<lenRes;i++)
ans.push_back(res[i]);
return ans;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: