大整數相加
前言
Q:有兩個大整數,大到 long 型都無法存放,如何實現它們相加?
A:。。。
思路
要解決這個問題,有兩個問題需要解決:
- 如何儲存兩個大整數
- 相加
如果 long都無法儲存,那麼,這個數肯定非常大,只能使用其它方式儲存了。我們可以使用字串來儲存資料,字串不限長度,再大的數字都能存下來。但另一個問題就來了,字串是不能相加的
回想整數相加,如果我們手動在紙上運算,先將數字從個位數開始對齊,然後一一相加,結果大於10則進位,如下圖:

如果將字串元素存入陣列中,遍歷陣列,從個位開始相加,注意進位,結果依然儲存在一個數組當中,模擬手動計算的方式,最後肯定能得出正確結果。
實現
public static int[] bigNumAdd(String s1, String s2){ //根據字串建立int型 陣列 int[] n1 = createIntArray(s1); int[] n2 = createIntArray(s2); //結果陣列的長度,應該是最長陣列長度加1,因為兩個數相加,最多結果增加1位數,不可能增加兩位及以上 int rLength = n1.length > n2.length ? n1.length + 1 : n2.length + 1; int[] result = new int[rLength]; //將兩個陣列倒序,以便個位數在陣列前頭,方便計算,實現對齊 reverseArray(n1); reverseArray(n2); int temp = 0; int bTemp = 0; int num1 = 0; int num2 = 0; //遍歷次數為result.length - 1,就是最長相加陣列長度 for (int i = 0; i < result.length - 1; i++) { //保證兩個相加數不會陣列越界 if (i < n1.length) { num1 = n1[i]; }else { num1 = 0; } if (i < n2.length) { num2 = n2[i]; }else { num2 = 0; } //兩個同位置的數字相加,注意還要加原本位置上的結果元素,因為前一步計算中可能產生進位 temp = num1 + num2 + result[i]; //計算進位,如果相加結果大於10,肯定有進位,因為是兩個數相加,進位值只能是1 if (temp >= 10) { bTemp = 1; temp = temp - 10; }else { bTemp = 0; } //設定當前位的結果數值以及下一位的進位值 result[i] = temp; if (bTemp > 0) { result[i+1] = bTemp; } } //除去結果中高位多餘的0 result = removeZero(result); //再將倒序結果,得到期望的結果值 reverseArray(result); System.out.println(" bigNumAdd " + Arrays.toString(result)); return result; }
具體實現如上,相加地方都有對應說明,應該比較容易懂。具體程式碼可以檢視本人的github