1. 程式人生 > >JAVA 大整數加法的實現

JAVA 大整數加法的實現

/**
  * 整數加法
  * 
  * @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