算法基础 (7)高精度乘法

给定两个正整数A和B,请你计算A * B的值。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共一行,包含A * B的值。
数据范围
1 ≤ A的长度 ≤ 100000,
0 ≤ B ≤ 10000
输入样例:
2
3
输出样例:
6

高精度乘法算法分析
  1. 同高精度加法与减法相同,都采用逆序存储。
  2. 因为B的数据范围是10^5以内所以可以用A的每一位去乘b
  3. 模拟乘法规则,从A的个位到高位与B相乘,乘得的结果放入t中,则此位的数为t % 10.把t / 10剩余给下一个高位
  4. 若遍历完整个At > 0,则表示还有剩余的数,则需要将剩余的数继续补到下一个高位
  5. 同样需要去掉前导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;
    }
}

你可能感兴趣的:(算法,算法,java)