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





  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值