思路:竖式乘法,遍历num1 的所有位,与num2 相乘再相加。
补0:num1 除了第一位的其他位与 num2 运算的结果需要补0。
预备知识:leetcode415.字符串相加
public String multiply(String num1, String num2) {
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
int m = num1.length();
int n = num2.length();
String res = "0";
//num1的每一位乘num2
for (int i=m-1;i>=0;i--){
StringBuilder sb = new StringBuilder();
//补0
for (int j=i;m-1-j>0;j++)
sb.append(0);
int n1 = Character.getNumericValue(num1.charAt(i));
// num1 的第 i 位数字 n1 与 num2 相乘
int carry = 0;
for (int k=n-1;k>=0||carry>0;k--){
int n2 = k<0?0:Character.getNumericValue(num2.charAt(k));
int product = (carry + n2*n1)%10;
sb.append(product);
carry = (carry + n2*n1)/10;
}
res = addStrings(res,sb.reverse().toString());
}
return res;
}
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int carry=0;
for(int i=num1.length()-1,j=num2.length()-1;i>=0||j>=0;i--,j--){
int x = i < 0 ? 0 : Character.getNumericValue(num1.charAt(i));
int y = j < 0 ? 0 : Character.getNumericValue(num2.charAt(j));
int point = (carry + x+y)%10;
sb.append(point);
carry = (carry + x+y)/10;
}
if(carry>0)
sb.append(carry);
return sb.reverse().toString();
}