JAVA 大整數加法的實現
阿新 • • 發佈:2019-01-05
/** * 整數加法 * * @param lv * 左值 * @param rv * 右值 * @param result * 相加的結果 * @數值存放說明 數值的每一位作為棧的一項存放在棧中,從棧底到棧頂依次是數值的高位到低位 * @演算法描述 輸入的加數倒序存放在棧中(即棧頂是數的最低位,棧底是數的最高位)。 計算的時候,依次彈出棧中的資料,對每一位執行加操作。 * 若遇到進位,則將進位標誌carry設定為1,以在進行下一位計算的時候將其加上。 進位加結束後,將carry的值重置為0。 * 每次計算都會檢查進位標誌carry的值 */ void plus(Stack<Integer> lv, Stack<Integer> rv, Stack<Integer> result) { int sum = 0; // 進位標誌 int carry = 0; while (true) { try { // 兩個加數的長度都還不為0,繼續分別在兩個棧中取出一位相加 if (!lv.empty() && !rv.empty()) { // 兩個加數取出一位值相加,再加上進位(因為在有進位時carry=1,無進位時carry=0,根據任何數與0相加都等於0,所以可以直接加上) sum = lv.pop() + rv.pop() + carry; // 進位標誌使用後,重置為0 carry = 0; // 根據當前加數的和再加上進位的結果是否大於9(即10甚至更大,因為每一位加數的最大值只可能是9,所以這裡最大也只能是18) // 進行是否進位的判斷依據,若大於9,將當前位相加的結果減去10,並將進位標誌設定為1 if (sum > 9) { sum -= 10; carry = 1; } result.push(sum); // 在兩個加數的每一位都進行了計算後,判斷是否還有進位,若有則加到結果的最高位 // 為了在兩個加數位數(長度)不相等時能正確地計算,這個條件必需放在下面的兩個條件前面 } else if (lv.empty() && rv.empty()) { if (carry == 1) result.push(carry); return; // 左值已經為空(每一位都參與了計算),而右值還不為空時,將右值的每一位取出加上進位值放到結果中 } else if (lv.empty()) { sum = rv.pop() + carry; carry = 0; if (sum > 9) { sum -= 10; carry = 1; } result.push(sum); // 同上面左值說明 } else if (rv.empty()) { sum = lv.pop() + carry; carry = 0; if (sum > 9) { sum -= 10; carry = 1; } result.push(sum); } } catch (Exception e) { System.err.println("棧溢位"); } } }
棧的方式實現,主要注意進位的處理。
轉載地址:http://www.cnblogs.com/hyjiacan/archive/2012/02/15/large-integer-plus.html
大數值的加法,還可以通過陣列的模式實現,原理跟棧的方式差不多,參考地址:http://blog.csdn.net/huberjobs/article/details/51036505