1. 程式人生 > 其它 >【演算法】兩個大數(陣列)求和

【演算法】兩個大數(陣列)求和

技術標籤:演算法演算法

學而不思則罔,思而不學則殆
@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. 計算陣列的長度為最大的值
  2. 返回的陣列長度為最大值+1(因為可能產生進位)
  3. 求演算法開始的初始下標(從末尾開始)
  4. 迴圈求和
  5. 處理未處理完的陣列(A|B)
  6. 處理最高為的進位

最終返回的資料沒有做處理,比如剔除最高位為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]