前言
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