给出两个很大的整数,要求实现程序求出两个整数之和。
将整数拆分成数组计算,这种思想在BigInteger中也有使用,数组中的一位可以存一个数字也可以存一个int值。BigInteger采用的是存一个int值,且使用位运算,效率能提到提升。
public class BigNumberSum {
public static void main(String[] args) {
//给出两个很大的整数,要求实现程序求出两个整数之和,整数可能很大,超过long类型的容量。
//将整数拆分成数组计算
BigNumberSum bigNumberSum = new BigNumberSum();
int[] a = {1, 2, 3, 4, 5};
int[] b = {9, 2, 3, 4, 5};
Arrays.stream(bigNumberSum.bigNumberSum(a, b)).forEach(System.out::print);
}
private int[] bigNumberSum(int[] a, int[] b) {
//取较大整数的长度作为数组的长度
int length = Math.max(a.length, b.length);
//计算结果
int[] sum = new int[length];
//当整数位数不足时,填补成相同位数
int[] padding = new int[length];
//进位位
int flag = 0;
if (a.length > b.length) {
System.arraycopy(b, 0, padding, length - b.length, b.length);
b = padding;
} else if (a.length < b.length) {
System.arraycopy(a, 0, padding, length - a.length, a.length);
a = padding;
}
//将整数的加法变成数组中每一位的加法
for (int i = length - 1; i >= 0; i--) {
if (a[i] + b[i] + flag >= 10) {
sum[i] = a[i] + b[i] + flag - 10;
flag = 1;
} else {
sum[i] = a[i] + b[i] + flag;
flag = 0;
}
}
//如果溢出则需要扩容数组
if (flag == 1) {
int[] newSum = new int[length + 1];
System.arraycopy(sum, 0, newSum, 1, length);
newSum[0] = 1;
sum = newSum;
}
return sum;
}
}