现在的位置: 首页 > 综合 > 正文

Multiply Strings

2017年12月23日 ⁄ 综合 ⁄ 共 1098字 ⁄ 字号 评论关闭

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

 

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

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

 

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;
	}
}

 

【上篇】
【下篇】

抱歉!评论已关闭.