码迷,mamicode.com
首页 > 其他好文 > 详细

43. Multiply Strings

时间:2017-10-17 18:45:55      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:通过   product   java   amp   http   计算   递增   结果   翻转   

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contains only digits 0-9.
  3. Both num1 and num2 does not contain any leading zero.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

题目含义:计算两个非负整数的乘法,并用string返回

思路:

num1[i] * num2[j]` will be placed at indices `[i + j`, `i + j + 1]` 

技术分享

 

 1     public String multiply(String num1, String num2) {
 2         int m=num1.length(),n=num2.length();
 3         int[] result = new int[m+n];
 4         for (int i=m-1;i>=0;i--)
 5         {
 6             for (int j=n-1;j>=0;j--)
 7             {
 8                 int mul = (num1.charAt(i)-‘0‘) * (num2.charAt(j)-‘0‘);
 9                 int p1 = i+j;
10                 int p2 = i + j +1;
11                 int sum = mul + result[p2];
12                 result[p1] += sum/10;
13                 result[p2] = sum%10;
14             }
15         }
16         StringBuilder sb = new StringBuilder();
17         for (int p:result)
18         {
19             if(!(sb.length() == 0 && p == 0))
20             {
21                 sb.append(p);
22             }
23         }
24         return sb.length()==0?"0":sb.toString();        
25     }

 方法二:

计算两个字符串表示的非负大整数的乘积,结果仍然用字符串表示。

我们都熟悉笔算的整数乘积,按照被乘数逐位与乘数求积,保存进位;当被乘数换位时,结果递增一个数量级,与先前结果求和。

技术分享

 

如上例所示,当我们计算字符串“123”*“456”时,采取与笔算相同的思想,按照从个位—>高位的计算思想,现将字符串翻转,计算完成后,翻转结果,返回。

 

 1  string multiply(string num1, string num2) {
 2         //如果有其中一个乘数的字符串表示为空,则返回空字符串
 3         if (num1.empty() || num2.empty())
 4             return string();
 5 
 6         if (num1 == "0" || num2 == "0")
 7             return "0";
 8 
 9         //按照整数从低位到高位计算,翻转两个乘数字符串
10         reverse(num1.begin(), num1.end());
11         reverse(num2.begin(), num2.end());
12         //求两个乘数字符串的长度
13         int len1 = strlen(num1.c_str()), len2 = strlen(num2.c_str());
14 
15         //定义乘法结果字符串
16         string ret = "";
17         //保存进位
18         int carry = 0; 
19 
20         for (int i = 0; i < len1; i++)
21         {
22             //乘数的处理起始位
23             size_t pos = i;
24             for (int j = 0; j < len2; j++)
25             {
26                 int temp = (num1[i] - ‘0‘) * (num2[j] - ‘0‘) + carry;
27 
28                 //向当前位加入结果
29                 if (pos < ret.length())
30                 {
31                     temp = temp + (ret[pos] - ‘0‘);
32                     ret[pos] = temp % 10 + ‘0‘;
33                 }//if
34                 else{
35                     ret.append(1, temp % 10 + ‘0‘);
36                 }//else
37                 //计算下一个进位
38                 carry = temp / 10;
39                 //处理乘数的下一位
40                 pos++;
41             }//for
42             if (carry > 0)
43                 ret.append(1, carry + ‘0‘);
44             carry = 0;
45         }//for
46 
47         //翻转整个结果字符串
48         reverse(ret.begin(), ret.end());
49         return ret;
50 
51     }

 

 

附录:

 1 String str1="111";  
 2 String str2="222";  
 3 BigDecimal num1 = new BigDecimal(str1);  
 4 BigDecimal num2 = new BigDecimal(str2);  
 5 然后通过BigDecimal的加减乘除方法,进行运算:  
 6 加法:  
 7 BigDecimal result = num1.add(num2);  
 8 减法:  
 9 result = num1.subtract(num2);  
10 除法:  
11 result = num1.divide(num2);  
12 乘法:  
13 result = num1.multiply(num2);  

 

43. Multiply Strings

标签:通过   product   java   amp   http   计算   递增   结果   翻转   

原文地址:http://www.cnblogs.com/wzj4858/p/7682736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!