原题链接在这里: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();
}
}