题目:
给出两个很大的整数,求出两个整数相加的和。
方式1:
思路:
第1步:创建两个整型数组,数组长度是较大整数的位数加1,把每一个整数倒序存储到数组中,整数的个位存储到数组下标为0的位置,最高位存于数组的尾部。
第2步:创建结果数组,结果数组的长度同样是较大整数的位数+1,加1的目的为进位做准备。
第3步:遍历两个数组,从左到右按照对应下标把元素两两相加,并处理进位。
第4步:把结果数组逆序,去掉首位的0,即为最终的结果。
public static String bigNumberSum(String bigNumberA, String bigNumberB) {
int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();
int[] arrayA = new int[maxLength + 1];
for(int i = 0; i < bigNumberA.length(); i ++) {
//减'0'是为了把字符串处理成int
//否则'9'对应ASCII码为57
//'0'对应48
arrayA[i] = bigNumberA.charAt(bigNumberA.length() - 1 - i) - '0';
}
int[] arrayB = new int[maxLength + 1];
for(int i = 0; i < bigNumberB.length(); i ++) {
arrayB[i] = bigNumberB.charAt(bigNumberB.length() - 1 - i) - '0';
}
int[] result = new int[maxLength + 1];
for(int i = 0; i < result.length; i ++) {
int temp = result[i];
temp += arrayA[i];
temp += arrayB[i];
if(temp >= 10) {
result[i + 1] = 1;
temp = temp - 10;
}
result[i] = temp;
}
StringBuilder sb = new StringBuilder();
boolean findFirst = false;
for(int i = result.length - 1; i >= 0; i --) {
if(!findFirst) {
if(result[i] == 0) {
continue;
}
findFirst = true;
}
sb.append(result[i]);
}
return sb.toString();
}
方式2:
将大数处理成可以被直接进行运算的int型(-2147483648~2147483647),此处取9位,如此一来,内存占用空间和计算次数都相应减少。
public static String bigNumberSum2(String bigNumberA,String bigNumberB) {
int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();
//不管是否整除都多一组,为进位做准备
int group = maxLength / 9 + 1;
int[] groupA = new int[group];
int[] groupB = new int[group];
//补齐长度
while(bigNumberA.length() < group*9) {
bigNumberA = "0" + bigNumberA;
}
while(bigNumberB.length() < group * 9) {
bigNumberB = "0" + bigNumberB;
}
for(int i = 0; i < group; i ++) {
groupA[i] = Integer.parseInt(bigNumberA.substring(i*9, (i+1)*9));
groupB[i] = Integer.parseInt(bigNumberB.substring(i*9, (i+1)*9));
}
int result[] = new int[group];
int carry = 0;
for(int i = group - 1; i >= 0; i--) {
String temp = (groupA[i] + groupB[i] + carry) + "" ;
if(temp.length() > 9){
int m = temp.length() % 9;
carry = Integer.parseInt(temp.substring(0,m));
result[i] = Integer.parseInt(temp.substring(m));
} else {
carry = 0;
result[i] = Integer.parseInt(temp);
}
}
StringBuilder sb = new StringBuilder();
for(int i = 0; i < group; i ++) {
if(result[i] == 0) {
continue;
}
sb.append(result[i]);
}
return sb.toString();
}
工具类BigInteger和BigDecimal的底层实现同样是把大数字转换位int型的数组,进行计算的。
参考:漫画算法