Leetcode43. 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.

个人思路

这个题目是写一个不限定长度的乘法器,花了三个晚上才AC。

我的思路是1、将乘数中的每个数字依次读出,与被乘数的每一位相乘,使用base存放值,add存放进位值。将求得的结果用二元数组vector<vector<int>>保存。

     2、将二元数组中的元素前后均对齐,无法对其的补0占位。例如,123*456我们得到 738 615 492。我们采用前后补0的方式得到 00738,06150,49200.

       然后同样使用base和add两个变量将其求和。结果保存在数组中,最后讲数组转化成string形式。

注意:乘数中存在0时,要特殊考虑,因为返回结果只能为0,不能为0000。

这种方法时间开销比较大,坚持写完也是因为自己花了很多时间调试。

 1 class Solution {
 2 public:
 3     string multiply(string num1, string num2) {
 4         if(num1=="0"||num2=="0"){
 5             return "0";
 6         }
 7         vector< vector<int> > result;
 8          //string answer;
 9          //向上进位的值
10          int add = 0;
11          //留在该位的值
12          int base;
13          //两数相乘的结果
14          long multi;
15          long sumsult = 0;
16         // num1 = num1.crbegin();
17         // num2 = num2.crbegin();
18          for(int j = num2.size()-1;j>=0;j--){
19              vector<int> lineresult;
20              for(int i = num1.size()-1;i>=0;i--){
21                 multi = atoi((num1.substr(i,1)).c_str())*atoi((num2.substr(j,1)).c_str());
22                 base = (multi+add)%10;
23                 lineresult.push_back(base);
24                 add = (multi+add)/10;
25             }
26             if(add!=0){
27                 lineresult.push_back(add);
28                 add = 0;
29             }
30             result.push_back(lineresult);
31          }
32          //将所有项的位数对其
33          int lineNum = result.size();
34          for(int i = 0;i<lineNum;i++){
35              for(int j = 0;j<i;j++){
36                 result[i].insert(result[i].begin(),0);
37              }
38          }
39          for(int i = 0;i<lineNum;i++){
40              for(int k = (result[i]).size();k<(result[lineNum-1]).size();k++){
41                  result[i].push_back(0);
42              }
43          }
44          add = 0;
45          base = 0;
46          //i代表每一位数,j代表加数的个数
47           for(int i = 0;i<result[lineNum-1].size();i++){
48              int addsult = add;
49              for(int j = 0;j<lineNum;j++){
50                  addsult +=result[j][i];
51              }
52              base = addsult%10;
53              result[lineNum-1][i] = base;
54              add = addsult/10;
55          }
56          if(add!=0){
57              result[lineNum-1].push_back(add);
58              add = 0;
59          }
60 
61          string turn = "";
62          for (int i = result[lineNum-1].size()-1; i >= 0; i--) {
63             turn  += to_string(result[lineNum-1][i]);
64         }
65         
66          return turn;
67          
68     }
69 };

他山之石

这个题目是写一个不限定长度的乘法器,花了三个晚上才AC。

原文地址:https://www.cnblogs.com/timesdaughter/p/5339299.html