题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
解题思路
- 模拟”乘法竖式“的计算方法
- 计算"被乘数"与"乘数"的一位数相乘的积
- 将上一步结果加到结果中
代码
class Solution {
public String multiply(String num1, String num2) {
if ("0".equals(num1) || "0".equals(num2)) return "0";
StringBuilder resReverse = new StringBuilder(), num1Reverse = new StringBuilder(num1).reverse();
// 模拟"乘法竖式"的计算方法
for (int i = 0; i < num2.length(); i++) {
// 得到"被乘数"与"乘数"的一位数相乘的积
StringBuilder subResReverse =
multiply(num1Reverse, num2.charAt(i) - 48, num2.length() - 1 - i);
// 加到结果中
resReverse = add(resReverse, subResReverse);
}
return resReverse.reverse().toString();
}
/**
* 计算"被乘数"与"乘数"的一位数相乘的积
*
* @param num1 被乘数(逆序)
* @param num2 乘数的一位数
* @param zero 补0的个数
* @return 积(逆序):比如结果是"12",这里返回"21"
*/
private StringBuilder multiply(StringBuilder num1, int num2, int zero) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < zero; i++) sb.append('0');
int carry = 0;
for (int i = 0; i < num1.length(); i++) {
int temp = (num1.charAt(i) - 48) * num2 + carry;
carry = temp / 10;
sb.append(temp % 10);
}
return carry > 0 ? sb.append(carry) : sb;
}
/**
* 加法
*
* @param num1 加数1(逆序)
* @param num2 加数2(逆序)
* @return 和(逆序):比如结果是"12",这里返回"21"
*/
public StringBuilder add(StringBuilder num1, StringBuilder num2) {
StringBuilder sb = new StringBuilder();
int length = Math.max(num1.length(), num2.length()), index = 0, carry = 0;
while (index < length) {
int temp = carry;
if (index < num1.length()) temp += num1.charAt(index) - 48;
if (index < num2.length()) temp += num2.charAt(index) - 48;
index++;
carry = temp / 10;
sb.append(temp % 10);
}
return carry > 0 ? sb.append(carry) : sb;
}
}