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

来源:互联网 发布:男内裤 知乎 编辑:程序博客网 时间:2024/06/07 03:36

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 同时需要把两个进位值都清零。

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

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. string multiply(string num1, string num2) {  
  2.         int n1 = num1.length();  
  3.         int n2 = num2.length();  
  4.         if(n1 == 0 || n2 == 0) return "0";  
  5.         int upto = 0;  
  6.         int sumupto = 0;  
  7.         string sum;  
  8.         int s = 0;  
  9.         sum.resize(n1+n2, '0');  
  10.         int i, j;  
  11.         for (i = n1-1; i >= 0; i--)  
  12.         {  
  13.             int a = num1[i] - '0';  
  14.             //注意:每次新开始upto进位值都要清零  
  15.             for (j = n2-1, upto = 0; j >= 0; j--)  
  16.             {  
  17.                 int b = num2[j] - '0';  
  18.                 s = b * a + upto;  
  19.                 upto = s / 10;  
  20.                 //注意:要系统分析,先计算出乘法,处理好,之后再处理加法。  
  21.   
  22.                 int rmd = s%10;  
  23.                 int sij1 = sum[i+j+1] - '0';  
  24.                 int rs = rmd + sij1 + sumupto;  
  25.   
  26.                 sumupto = rs/10;  
  27.                 rs %= 10;  
  28.                 sum[i+j+1] = rs + '0';                
  29.             }  
  30.             //注意:把最后一次的进位值加上!  
  31.             //注意:要把加法进位和乘法进位都加上  
  32.             sum[i+j+1] += (upto+sumupto);  
  33.             //注意:加法进位一定需要清零  
  34.             sumupto = 0;  
  35.         }  
  36.         while (sum.length() > 1 && sum[0] == '0') sum.erase(sum.begin());  
  37.   
  38.         return sum;  
  39.     }  
  40.     /*令人难以想象的特殊情况 
  41.     Input:  "9133", "0" 
  42.     Output: "0000" 
  43.     Expected:   "0" 
  44.     */  

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

 

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

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //2014-1-27  
  2.     string multiply(string num1, string num2)   
  3.     {  
  4.         string rs(num1.length()+num2.length(), '0');  
  5.   
  6.         for (int i = num1.length()-1, d = rs.length()-1; i >= 0; i--, d--)  
  7.         {  
  8.             int carry = 0, k = d;  
  9.             for (int j = num2.length()-1; j >= 0; j--, k--)  
  10.             {  
  11.                 int a = num1[i] - '0';  
  12.                 int b = num2[j] - '0';  
  13.                 a = a*b+carry + (rs[k]-'0');  
  14.                 carry = a/10;  
  15.                 rs[k] = a%10 + '0';  
  16.             }  
  17.             while (carry)  
  18.             {  
  19.                 int sum = carry + (rs[k]-'0');  
  20.                 carry = sum / 10;  
  21.                 rs[k--] = sum % 10 + '0';  
  22.             }  
  23.         }  
  24.         while (rs.size() > 1 && rs[0] == '0') rs.erase(rs.begin());  
  25.         return rs;  
  26.     }  
0 0
原创粉丝点击