学而不思则罔,思而不学则殆
题目
输入:A = “999999” 和 B = “1”
返回:result = “1000000”
思路
主要是解决整型溢出的大数运算,主要思路:从最低位开始求和,本位等于求和的余数,进位提供给下一位求和使用。【默认进位为0】
Demo
static char[] sum(char[] A, char[] B) {
int flag = 0;
//1.计算数组的长度为最大的值
int max = Math.max(A.length, B.length);
//2.返回的数组长度为最大值+1(因为可能产生进位)
char[] sumChar = new char[max + 1];
//3.求和数组下标(从末尾开始)
int sumIndex = sumChar.length - 1;
int aIndex = A.length - 1, bIndex = B.length - 1;
//4.循环求和
for (; aIndex >= 0 && bIndex >= 0; ) {
//计算数字
char aCh = A[aIndex--];
char bCh = B[bIndex--];
//求和 a+b+flag;
int tmpSum = Integer.parseInt("" + aCh) + Integer.parseInt("" + bCh) + flag;
sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
flag = tmpSum / 10;
}
//5.处理未处理的数组A
for (; aIndex >= 0; ) {
//求和 a+flag;
char aCh = A[aIndex--];
int tmpSum = Integer.parseInt("" + aCh) + flag;
sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
flag = tmpSum / 10;
}
//6.处理未处理的数组B
for (; bIndex >= 0; ) {
//求和 b+flag;
char bCh = B[bIndex--];
int tmpSum = Integer.parseInt("" + bCh) + flag;
sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
flag = tmpSum / 10;
}
//7.处理最高为的进位
sumChar[sumIndex] = (char) (flag + '0');
return sumChar;
}
算法思路如下:
- 计算数组的长度为最大的值
- 返回的数组长度为最大值+1(因为可能产生进位)
- 求算法开始的初始下标(从末尾开始)
- 循环求和
- 处理未处理完的数组(A|B)
- 处理最高为的进位
最终返回的数据没有做处理,比如剔除最高位为0的情况。
测试
测试产生进位
char[] A = new char[]{'9', '9', '9', '9', '9', '9', '9'};
char[] B = new char[]{'1'};
char[] sum = sum(A, B);
System.out.println(Arrays.toString(sum));
结果如下:
[1, 0, 0, 0, 0, 0, 0, 0]
测试二
A = new char[]{'0', '9', '9', '9', '9', '9', '9'};
B = new char[]{};
sum = sum(A, B);
System.out.println(Arrays.toString(sum));
结果如下:
[0, 0, 9, 9, 9, 9, 9, 9]
测试三
A = new char[]{'1', '2', '3', '4', '5', '6', '7'};
B = new char[]{'7', '6', '5', '4', '3', '2', '1'};
sum = sum(A, B);
System.out.println(Arrays.toString(sum));
结果如下:
[0, 8, 8, 8, 8, 8, 8, 8]