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;
	}
}

运行结果:
java数组实现几乎任意长度两数字乘法