java数组实现几乎任意长度两数字乘法
java数组实现几乎任意长度两数字乘法
今天周五,心血来潮用java数组写了一个计算超大数乘法的方法,不怎么完美,仅供参考。
我们知道,在java中整数型long最大只能为9223372036854775807,那么大于计算结果大于这个数怎么办呢?甚至需要计算这么大甚至更大的两个数相乘呢?当然jdk提供了进行大数相乘的类BigInteger,传入任意长度的两个数字字符串即可进行各种运算。它为什么能计算几乎任意大的值呢?原理就是把运算结果的每一位存放在数组中,这样长度几乎不受限制了。基于这个原理,可以自己实现类似的计算大数相乘的功能。
下面贴代码:
/**
* 数组实现大数乘法
*/
public class MyBigInteger {
public static void main(String[] args) {
int[] bigInt1 = new int[]{9,5,2,7,4,3};
int[] bigInt2 = new int[]{6,3,7,2,9,2,2,7,4};
//结果是607175753007582
multi(bigInt1,bigInt2);
//字符串类型数字重载方法
multi("9527435464646466576564694345","93729227465646564645646456456");
}
public static int[] multi(int[] num1 , int[] num2){
//n位数*m位数最多是n+m位
int[] result = new int[num1.length + num2.length];
int index = result.length -1;
//先不进位进行相乘后面再进行进位操作
//为了符合我们竖式计算的习惯,从前往后遍历数组
for (int i = num2.length -1; i >= 0; i--) {
for (int j = num1.length -1; j >= 0; j--) {
int temp = num1[j] * num2[i];
result[index] += temp;
index--;
}
index = result.length - 1 - (num2.length - i);
}
//对result进行进位操作
for (int i = result.length -1; i > 0; i--) {
//当前位值
int self = result[i];
//高位值
int hight = result[i - 1];
result[i] = self % 10;
result[i - 1] += self / 10;
}
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]);
}
System.out.println();
return result;
}
//字符串类型数字重载方法
public static int[] multi(String num1 , String num2){
int[] result = new int[num1.length() + num2.length()];
//将字符串转为int数组
int[] numInt1 = new int[num1.length()];
int[] numInt2 = new int[num2.length()];
String[] num1Split = num1.split("");
String[] num2Split = num2.split("");
for (int i = 0; i < num1Split.length; i++) {
numInt1[i] = Integer.parseInt(num1Split[i]);
}
for (int i = 0; i < num2Split.length; i++) {
numInt2[i] = Integer.parseInt(num2Split[i]);
}
result = multi(numInt1,numInt2);
return result;
}
}
运行结果: