大整数相加

277 阅读2分钟

前言

Q:有两个大整数,大到 long 型都无法存放,如何实现它们相加? A:。。。

思路

要解决这个问题,有两个问题需要解决:

  • 如何存储两个大整数
  • 相加

如果 long都无法存储,那么,这个数肯定非常大,只能使用其它方式存储了。我们可以使用字符串来存储数据,字符串不限长度,再大的数字都能存下来。但另一个问题就来了,字符串是不能相加的

回想整数相加,如果我们手动在纸上运算,先将数字从个位数开始对齐,然后一一相加,结果大于10则进位,如下图:

如果将字符串元素存入数组中,遍历数组,从个位开始相加,注意进位,结果依然保存在一个数组当中,模拟手动计算的方式,最后肯定能得出正确结果。

实现

public static int[] bigNumAdd(String s1, String s2){
	//根据字符串创建int型 数组
	int[] n1 = createIntArray(s1);
	int[] n2 = createIntArray(s2);
	//结果数组的长度,应该是最长数组长度加1,因为两个数相加,最多结果增加1位数,不可能增加两位及以上
	int rLength = n1.length > n2.length ? n1.length + 1 : n2.length + 1;
	int[] result = new int[rLength];
	
	//将两个数组倒序,以便个位数在数组前头,方便计算,实现对齐
	reverseArray(n1);
	reverseArray(n2);
	int temp = 0;
	int bTemp = 0;
	int num1 = 0;
	int num2 = 0;
	//遍历次数为result.length - 1,就是最长相加数组长度
	for (int i = 0; i < result.length - 1; i++) {
		//保证两个相加数不会数组越界
		if (i < n1.length) {
			num1 = n1[i];
		}else {
			num1 = 0;
		}
		
		if (i < n2.length) {
			num2 = n2[i];
		}else {
			num2 = 0;
		}
		//两个同位置的数字相加,注意还要加原本位置上的结果元素,因为前一步计算中可能产生进位
		temp = num1 + num2 + result[i];
		//计算进位,如果相加结果大于10,肯定有进位,因为是两个数相加,进位值只能是1
		if (temp >= 10) {
			bTemp = 1;
			temp = temp - 10;
		}else {
			bTemp = 0;
		}
		//设置当前位的结果数值以及下一位的进位值
		result[i] = temp;
		if (bTemp > 0) {
			result[i+1] = bTemp;
		}
	}
	//除去结果中高位多余的0
	result = removeZero(result);
	//再将倒序结果,得到期望的结果值
	reverseArray(result);
	System.out.println(" bigNumAdd " + Arrays.toString(result));
	return result;
}

具体实现如上,相加地方都有对应说明,应该比较容易懂。具体代码可以查看本人的github