莫妒他长,妒长,则己终是短;莫护己短,护短,则己终不长。
1.乘法运算
这是一道入门的算法题,目的就是求两个超过基础数据类型所表示的两个数的乘积。
刚开始看到这道题我想的便是分解 计算 合并 ,但是合并后的数如何存储返回又是一个问题,苦思冥想下想到了用数组,并不断把算法优化。
首先实现这种大数运算,基础数据类型是无法存储也无法运算的,但是我们可以手写在纸上算
/**
* 7 8 9 6 5 2
* × 3 2 1 1
* -----------------
* 7 8 9 6 5 2 <---- 第1趟
* 7 8 9 6 5 2 <---- 第2趟
* .......... <---- 第n趟
* -----------------
* ? ? ? ? ? ? ? ? <---- 最后的值用另一个数组表示
*/
要做的就是把这个过程实现为代码,首先我用的是把每次乘的结果用List存储,并做进位处理,然后每算完一行就加到最后的结果位上,这里还要做偏移处理,最后把List反向转换成数组,按顺序输出便是结果了。
private static Integer[] Method1(int[]arr1 , int[] arr2){
ArrayList<Integer> result = new ArrayList<>(); //中间求和的结果
//arr2 逐位与arr1相乘
for(int i = arr2.length - 1; i >= 0; i--){
int carry = 0;
ArrayList<Integer> singleList = new ArrayList<>();
//arr2 逐位单次乘法的结果
for(int j = arr1.length - 1; j >= 0; j--){
int r = arr2[i] * arr1[j] + carry;
c