【力扣】43. 字符串相乘(大数相乘)
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。
题解
模拟相乘的过程。每次取乘数的每一位与被乘数相乘,然后相加(相加就是大数相加),在相乘的时候,需要注意在后面补0(因为是从小位到大位操作,实际是先补0)
java
import java.util.Scanner;
public class BigNumMultiply {
public static String multiply(String num1, String num2) {
// num1 和 num2 之一是 0,返回0
if (num1.equals("0") || num2.equals("0")) {
return "0";
}
String ans = "0";
// 从右往左遍历乘数
for (int i = num2.length() - 1; i >= 0; i--) {
// 当前乘的位
int y = num2.charAt(i) - '0';
StringBuffer curr = new StringBuffer();
int add = 0;
// 判断当前乘数所在的位,要补0
for (int j = num2.length() - 1; j > i; j--) {
curr.append(0);
}
// 每次遍历被乘数,逐位相乘
for (int j = num1.length() - 1; j >= 0; j--) {
int x = num1.charAt(j) - '0';
int product = x * y + add;
curr.append(product % 10);
// 更新下一个进位
add = product / 10;
}
// 最后的进位
if (add != 0) {
curr.append(add % 10);
}
// 被乘数与乘数的每一位 逐一相乘的结果再相加
ans = addStrings(ans, curr.reverse().toString());
}
return ans;
}
public static String addStrings(String num1, String num2) {
// 两个指针分别指向数字的末尾
int i = num1.length() - 1;
int j = num2.length() - 1;
// add 维护当前是否有进位
int add = 0;
StringBuffer ans = new StringBuffer();
// 加完 和进位完
while (i >= 0 || j >= 0 || add != 0) {
int x = i >= 0 ? num1.charAt(i) - '0' : 0;
int y = j >= 0 ? num2.charAt(j) - '0' : 0;
// 当前的和
int result = x + y + add;
// 最后的结果加上这个位的数字
ans.append(result % 10);
// 更新下一个进位
add = result / 10;
i--;
j--;
}
// 计算完以后的答案需要翻转过来
ans.reverse();
return ans.toString();
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = in.next();
String b = in.next();
String resultString = multiply(a, b);
System.out.println(resultString);
}
}