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