题目描述
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述
空格分隔的两个字符串,代表输入的两个大整数
输出描述
输入的乘积,用字符串表示
示例1
输入:72106547548473106236 982161082972751393
输出:70820244829634538040848656466105986748
分析:将最终结果的每一位都存储到一个一维数组中,一维数组长度为m+n,m和n是两个字符串的长度,通过双循环将一维数组的每一位都确定(不考虑进位),最后通过遍历数组整理进位(保证每个元素小于10)去除末尾0,合成字符串反转并结束。
package com.nowcoder.schoolEnrollment2018;
import java.util.Scanner;
/**
* @ClassName: PinDuoDuo2.java
* @Description:有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示,不能用系统自带的大整数类型。
* @author: Henray
* @version:1.0
* @Date: 2019年3月2日
*/
public class PinDuoDuo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String num1 = sc.next();
String num2 = sc.next();
System.out.println(Multiply(num1,num2));
}
public static String Multiply(String num1, String num2) {
num1 = new StringBuilder(num1).reverse().toString();
num2 = new StringBuilder(num2).reverse().toString();
int[] d = 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';
d[i + j] += a * b;
}
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < d.length; i++) {
int digit = d[i] % 10;
int carry = d[i] / 10;
builder.insert(0, digit);
if (i < d.length - 1)
d[i + 1] += carry;
}
while (builder.length() > 0 && builder.charAt(0) == '0') {
builder.deleteCharAt(0);
}
return builder.length() == 0 ? "0" : builder.toString();
}
}