不用BigInteger实现两个大数字相乘
思路
位数 | 1 | 2 | 3 |
---|---|---|---|
数字 | 3 | 4 | 5 |
6 | 7 | 8 |
如表所示
两个数345和678
两个数位数相加为6的数积为40
两个数位数相加为5的数为32+35
两个数位数相加为4的数为24+30+28
两个数位数相加为3的数为21+24
两个数位数相加为2的数为18
然后逐次进行进位得到最终的数
代码实现
public static void main(String[] args) {
System.out.println("请输入两个大数");
Scanner scanner = new Scanner(System.in);
if (scanner.hasNext()){
String num1 = scanner.next();
String num2 = scanner.next();
System.out.println("相乘结果为:"+getNum(num1, num2));
}
}
public static String getNum(String num1,String num2){
char[] char1 = num1.toCharArray();
char[] char2 = num2.toCharArray();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
//将char字符串转换为对应的数字
for (char c : char1) {
list1.add(c - '0');
}
for (char c : char2) {
list2.add(c - '0');
}
//设置一个定长的集合用于存放计算过后的结果
List<Integer> resList = new ArrayList<>(Collections.nCopies(list1.size()+list2.size(),0));
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
resList.set(i+j,resList.get(i+j)+list1.get(i)*list2.get(j));
}
}
for (int i = resList.size() - 1; i > 0; i--) {
resList.set(i-1,resList.get(i-1)+resList.get(i)/10);
resList.set(i,resList.get(i)%10);
}
StringBuffer sb = new StringBuffer();
resList.stream().limit(resList.size()-1).forEach(i->{
sb.append(i);
});
return sb.toString();
}
测试结果