LeetCode Multiply Strings 高精度乘法C++实现

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.

 

这道题就是模拟乘法思维了,还需要模拟加法思维,每一位乘以一个数都要和前面的结果加起来。

注意:

1 要把这两个操作过程分清楚,不能混饶了,否则会结果不正确的。

2 乘法有进位,和前面的结果加起来也有加法进位,一定要分清楚。

3 每一次一个新数位与被乘数相乘之前,都一定要把两个进位加在结果上。

4 同时需要把两个进位值都清零。

我基本上都是栽在这几个点上了,不然不用花那么长时间,思考问题的思路还是不够清晰,仍然需要继续提高啊!

string multiply(string num1, string num2) {
		int n1 = num1.length();
		int n2 = num2.length();
		if(n1 == 0 || n2 == 0) return "0";
		int upto = 0;
		int sumupto = 0;
		string sum;
		int s = 0;
		sum.resize(n1+n2, '0');
		int i, j;
		for (i = n1-1; i >= 0; i--)
		{
			int a = num1[i] - '0';
			//注意:每次新开始upto进位值都要清零
			for (j = n2-1, upto = 0; j >= 0; j--)
			{
				int b = num2[j] - '0';
				s = b * a + upto;
				upto = s / 10;
				//注意:要系统分析,先计算出乘法,处理好,之后再处理加法。

				int rmd = s%10;
				int sij1 = sum[i+j+1] - '0';
				int rs = rmd + sij1 + sumupto;

				sumupto = rs/10;
				rs %= 10;
				sum[i+j+1] = rs + '0';				
			}
			//注意:把最后一次的进位值加上!
			//注意:要把加法进位和乘法进位都加上
			sum[i+j+1] += (upto+sumupto);
			//注意:加法进位一定需要清零
			sumupto = 0;
		}
		while (sum.length() > 1 && sum[0] == '0') sum.erase(sum.begin());

		return sum;
	}
	/*令人难以想象的特殊情况
	Input:	"9133", "0"
	Output:	"0000"
	Expected:	"0"
	*/

思考算法问题都是令人头疼的事情,需要毅力去坚持!

 

 思路更加清晰,程序更加简洁了:

//2014-1-27
    string multiply(string num1, string num2) 
    {
	    string rs(num1.length()+num2.length(), '0');

	    for (int i = num1.length()-1, d = rs.length()-1; i >= 0; i--, d--)
	    {
		    int carry = 0, k = d;
		    for (int j = num2.length()-1; j >= 0; j--, k--)
		    {
			    int a = num1[i] - '0';
			    int b = num2[j] - '0';
			    a = a*b+carry + (rs[k]-'0');
			    carry = a/10;
			    rs[k] = a%10 + '0';
		    }
		    while (carry)
		    {
			    int sum = carry + (rs[k]-'0');
			    carry = sum / 10;
			    rs[k--] = sum % 10 + '0';
		    }
	    }
	    while (rs.size() > 1 && rs[0] == '0') rs.erase(rs.begin());
	    return rs;
    }


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值