一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

java中实现超大整数相加减

时间:2012-02-16 编辑:简简单单 来源:一聚教程网

 代码如下 复制代码
/**
   * 整数加法
   *
   * @param lv
   *            左值
   * @param rv
   *            右值
   * @param result
   *            相加的结果
   * @数值存放说明 数值的每一位作为栈的一项存放在栈中,从栈底到栈顶依次是数值的高位到低位
   * @算法描述 输入的加数倒序存放在栈中(即栈顶是数的最低位,栈底是数的最高位)。 计算的时候,依次弹出栈中的数据,对每一位执行加操作。
   *       若遇到进位,则将进位标志carry设置为1,以在进行下一位计算的时候将其加上。 进位加结束后,将carry的值重置为0。
   *       每次计算都会检查进位标志carry的值
 */
 void plus(Stack lv, Stack rv, Stack 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("栈溢出");
    }
   }
 }

热门栏目