【LeetCode练习题】Multiply Strings

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.

 

题目意思:

给两个string,计算string的乘积。

string中的数可以非常大并且是非负数。

(就是大数的乘法运算嘛。。。)

 

解题思路:

由于之前已经练习过了大数的加减乘除四则运算了,所以这道题跟那个是一样的原理。

要想实现乘法,首先得实现大数的加法,因为按照小学摆竖式计算乘法的时候需要在会加法的基础上才行。

于是我们首先实现了大数的加法,基本上就是模拟了用竖式每一位相加的过程,其中注意到产生的进制要参与高位的运算。

实现了加法后,乘法也就出来了。

更详细的四则运算完整代码在这里。

 

代码如下:

 1 string operator+(const string &num1,const string &num2){
 2     int nCarry = 0;
 3     string numTemp;
 4         
 5     int i = num2.size() - 1;
 6     int j = num1.size() - 1;
 7     for(; i >= 0 || j >= 0; i--,j--){
 8         char a,b;
 9         if(i>=0)
10             b = num2[i] - '0';
11         else
12             b = 0;
13         if(j>=0)
14             a = num1[j] - '0';
15         else
16             a = 0;
17         char c = a + b + nCarry;
18         nCarry = c / 10;
19         numTemp.push_back(c%10 + '0');
20     }
21 
22     if(nCarry != 0){
23         numTemp.push_back(nCarry + '0');
24     }
25 
26     for(i = 0, j = numTemp.size() - 1; i < j; i++,j--){
27         char cTemp = numTemp[i];
28         numTemp[i] = numTemp[j];
29         numTemp[j] = cTemp;
30     }
31     return numTemp;
32 }
33 string operator*(const string &num1,const string &num2){
34     int nCarry = 0;
35     string numTemp;
36     string result;
37 
38     int i = num2.size()-1;
39     for(; i >= 0; i--){
40         char a = num2[i] - '0';
41         int j = num1.size() - 1;
42         for(; j >= 0; j--){
43             char b = num1[j] - '0';
44             char c = b * a + nCarry;
45             nCarry = c/10;
46             numTemp.push_back(c % 10 + '0');
47         }
48         if(nCarry != 0){
49             numTemp.push_back(nCarry + '0');
50             nCarry = 0;
51         }
52 
53         //reverse
54         int n = 0;
55         int m = numTemp.size() - 1;
56         for(; n < m; n++,m--){
57             char cTemp = numTemp[n];
58             numTemp[n] = numTemp[m];
59             numTemp[m] = cTemp;
60         }
61 
62         for(int t = num2.size() - 1; t > i; t--)
63         {
64             numTemp.push_back('0');
65         }
66 
67         result = result + numTemp;
68         numTemp.clear();
69     }
70     return result;
71 }
72 
73 class Solution {
74 public:
75     string multiply(string num1, string num2) {
76         string ret;
77         string zero = "0";
78         if(!num1.compare(zero) || !num2.compare(zero)){
79             ret = "0";
80             return ret;
81         }
82         ret = num1 * num2;
83         return ret;
84     }
85 };

 

 

posted on 2014-04-07 16:46  Allen Blue  阅读(199)  评论(0编辑  收藏  举报

导航