题目描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例:
示例 1:
输入: num1 = "2", num2 = "3";输出: "6"
示例 2:
输入: num1 = "123", num2 = "456";输出: "56088"
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
注意:
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解答:
public static String multiply(String num1, String num2) {
int n1 = num1.length() - 1;
int n2 = num2.length() - 1;
if (n1 < 0 || n2 < 0) {
return "";
}
// 乘积的结果位数最多为:两个乘数的位数之和
int mul[] = new int[n1 + n2 + 2];
// 循环两个乘数的位数
for (int i = n1; i >= 0; i--) {
for (int j = n2; j >= 0; j--) {
// 两个乘数的每一位进行相乘
int midmul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
// 相乘结果+进位
midmul += mul[i + j + 1];
// 第i位和第j位相乘的结果在乘积中的位置为[i+j,i+j+1]
// [i+j]需要累加;相当于结果高位【数组中为低位】
mul[i + j] += midmul / 10;
// [i+j+1]直接加余数即可
mul[i + j + 1] = midmul % 10;
}
}
StringBuilder sBuilder = new StringBuilder();
int i = 0;
while (i < mul.length - 1 && mul[i] == 0)
// 截取前面的0
i++;
for (; i < mul.length; i++) {
// 拼接字符串作为结果
sBuilder.append(mul[i]);
}
return sBuilder.toString();
}
技巧:
字符串相乘:可以当作大数相乘,处理每位相乘即可,最后拼接结果。
网友评论