您的位置:首页 > 其它

LeetCode Multiply Strings

2015-08-18 03:32 405 查看
原题链接在这里:https://leetcode.com/problems/multiply-strings/

Method 1: 通过这道题,学到了BigInteger的用法, 他的constructor 可以直接从string建立BigInteger, 但要注意它的乘法API是
bi1.multiply(bi2).

若是中间需要考虑溢出,还有bi1.intValue(), bi1.longValue()等API.

Method 2: 若num1.length() = m, num2.length() = n, 那么结果的长度为m+n-1(没有进位),或者是m+n(有进位)。没有进位时,
结果对应的i位等于 (num1的1位 * num2的i位 + num1的2位 * num2的i-1位 + ... + num1的i位 * num2的1位)%10. 当然
前提是不能有溢出。为了方便计算与理解,可以先反转两个string,最后计算的结果的most significant位在最后,所
以需要反转回来。

AC Java:

import java.math.*;
public class Solution {
public String multiply(String num1, String num2) {
/*Method 1
if(num1 == null || num2 == null || num1.length() ==0 || num2.length() == 0)
return "";
BigInteger bi1 = new BigInteger(num1);
BigInteger bi2 = new BigInteger(num2);

BigInteger res = bi1.multiply(bi2);
return res.toString();
*/

//Method 2
if(num1 == null || num2 == null || num1.length() ==0 || num2.length() == 0)
return "";
if(num1.charAt(0) == '0'||num2.charAt(0) == '0'){
return "0"; //error
}

int len1 = num1.length();
int len2 = num2.length();
num1 = new StringBuilder(num1).reverse().toString(); //error
num2 = new StringBuilder(num2).reverse().toString();
StringBuilder res = new StringBuilder();

int carryDig = 0;
for(int i = 0; i < len1+len2-1; i++){
int mul = 0;
for(int j = 0; j<=i; j++){
if(j<len1 && (i-j)<len2){
mul += (int)(num1.charAt(j)-'0') * (int)(num2.charAt(i-j)-'0');
}
}
mul += carryDig;
res.append(mul%10);
carryDig = mul/10;
}

if(carryDig != 0){
res.append(carryDig);
}

return res.reverse().toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: