【演算法】兩個大數(陣列)求和
阿新 • • 發佈:2020-12-19
學而不思則罔,思而不學則殆
@TOC
題目
輸入: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]