给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
数据范围
1 ≤ A的长度 ≤ 100000,
0 ≤ B ≤ 10000
输入样例:
2
3
输出样例:
6
高精度乘法算法分析
- 同高精度加法与减法相同,都采用逆序存储。
- 因为
B
的数据范围是10^5
以内所以可以用A
的每一位去乘b
- 模拟乘法规则,从
A
的个位到高位与B
相乘,乘得的结果放入t
中,则此位的数为t % 10
.把t / 10
剩余给下一个高位 - 若遍历完整个
A
,t > 0
,则表示还有剩余的数,则需要将剩余的数继续补到下一个高位 - 同样需要去掉前导
0
,因为可能是乘一个0
那么A
有几位C
中就会有几位0
,需要去掉前导0
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class HighPrecisionMultiplication {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
int b = sc.nextInt();
List<Integer> A = new ArrayList<Integer>();
for (int i = a.length() - 1; i >= 0; i -- ) A.add(a.charAt(i) - '0');
List<Integer> C = mul(A, b);
for (int i = C.size() - 1; i >= 0; i -- ) System.out.print(C.get(i));
}
private static List<Integer> mul(List<Integer> A, int b) {
List<Integer> C = new ArrayList<Integer>();
int t = 0;
for (int i = 0; i < A.size() || t != 0; i ++ ) {
if (i < A.size()) t += A.get(i) * b;
C.add(t % 10);
t /= 10;
}
while (C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);
return C;
}
}