java数组实现任意长度两数字乘法
java数组实现超大数乘法的方法,不怎么完美,仅供参考。
我们知道,在java中整数型long最大只能为9223372036854775807,那么大于计算结果大于这个数怎么办呢?甚至需要计算这么大甚至更大的两个数相乘呢?当然jdk提供了进行大数相乘的类BigInteger,传入任意长度的两个数字字符串即可进行各种运算。它为什么能计算几乎任意大的值呢?原理就是把运算结果的每一位存放在数组中,这样长度几乎不受限制了。基于这个原理,可以自己实现类似的计算大数相乘的功能。
下面贴代码:
/**
* 数组实现大数乘法
*/
public class MyBigInteger {
public static void main(String[] args) {
int[] sum = sum(new int[]{9, 5, 2, 7, 4, 3}, new int[]{6, 3, 7, 2, 9, 2, 2, 7, 4});
Arrays.stream(sum).forEach(System.out::print);
System.out.println();
System.out.println(sum("234354", "435132113"));
System.out.println(sum("9527435464646466576564694345", "93729227465646564645646456456"));
}
public static String sum(String num1, String num2){
int[] num1Arr = Arrays.stream(num1.split("")).mapToInt(Integer::parseInt).toArray();
int[] num2Arr = Arrays.stream(num2.split("")).mapToInt(Integer::parseInt).toArray();
int[] sumArr = sum(num1Arr, num2Arr);
StringBuilder s = new StringBuilder();
Arrays.stream(sumArr).forEach(s::append);
return s.toString();
}
public static int[] sum(int[] num1, int[] num2){
//n位数*m位数最多是n+m位
int[] sum = new int[num1.length + num2.length];
int index = sum.length - 1;
for (int i = num2.length - 1; i >= 0; i--) {
for (int j = num1.length - 1; j >= 0; j--) {
sum[index] += num1[j] * num2[i];//先不进位,只是将每位乘积存放起来
if(index > 0){//进位操作
int low = sum[index];//低位
int high = sum[index - 1];//高位
sum[index] = sum[index] % 10;
sum[index - 1] += low / 10;
}
index--;
}
index = sum.length - 1 - (num2.length - i);//调整和数组索引,按照竖式计算的位置
}
return sum;
}
}
运行结果: