1.思路
高精度乘法是大数乘以一个int型的小数,和前面模拟不同,这里不是一位一位的乘,而是a一位乘以整个数b,当a乘到最高位且没有进位就结束了。
2.代码模板
方法一:
//a为大数,倒序存储,b为int型,返回a*b的结果
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a1 = in.next();
int b = in.nextInt();
List<Integer> a = new ArrayList<Integer>();
for (int i = a1.length() - 1; i >= 0; i -- )
a.add(a1.charAt(i) - '0');
List<Integer> c = multiply(a, b);
for (int i = c.size() - 1; i >= 0; i -- )
System.out.print((c.get(i)));
System.out.println();
in.close();
}
public static List<Integer> multiply(List<Integer> a, int b) {
int t = 0; //保存进位
List<Integer> c = new ArrayList<>(); //保存答案
for(int i = 0; i < a.size(); i++) {
t += a.get(i) * b; //用a的一位乘以b加上之前的进位
c.add(t % 10); //保存当前位计算的结果
t /= 10; //前面保存了一位,所以要开始对下一位计算存储
}
while(t != 0) { //如果进位还没用完
c.add(t % 10);
t /= 10;
}
while(c.size() > 1 && c.get(c.size() - 1) == 0) //去掉前导0,实际上只有b为0时才有前导0
c.remove(c.size() - 1);
return c;
}
}
方法二:
//Java大数
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String[] s = cin.readLine().split(" ");
BigInteger n = new BigInteger(s[0]);
s = cin.readLine().split(" ");
BigInteger m = new BigInteger(s[0]);
System.out.println(n.multiply(m));
}
}
3.复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)