1、问题:
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
例子:
输入
72106547548473106236 982161082972751393
输出
70820244829634538040848656466105986748
思路:
参考代码:
import java.util.Scanner;
public class Test4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String num1 = sc.next();
String num2 = sc.next();
System.out.println(getMutiply(num1, num2));
}
public static String getMutiply(String num1, String num2) {
num1 = new StringBuilder(num1).reverse().toString();
num2 = new StringBuilder(num2).reverse().toString();
// num1 和 num2 相乘的积不可能大于num1和num2的长度之和
int[] array = new int[num1.length() + num2.length()];
/*
* 将第一个数的所有位与第二个数的所有位相乘,结果放在对应的位置( 个位*个位--放在个位 个位*百位--放在百位 十位*十位--放在百位
* 十位*百位--放在千位 以此类推 )
*/
for (int i = 0; i < num1.length(); i++) {
int a = num1.charAt(i) - '0';
for (int j = 0; j < num2.length(); j++) {
int b = num2.charAt(j) - '0';
array[i + j] += a * b;
}
}
// 满十就要向前进位,carray表示进位数的值,digit表示当前位置的值
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.length; i++) {
int digit = array[i] % 10;
int carray = array[i] / 10;
sb.insert(0, digit);
if (i < array.length - 1)
array[i + 1] += carray;
}
// 结果最后位置是0的话,要去掉末尾的0
while (sb.length() > 0 && sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
return sb.length() == 0 ? "0" : sb.toString();
}
}