你的位置:首页 > 软件开发 > Java > JAVA 大整数加法的实现

JAVA 大整数加法的实现

发布时间:2012-02-15 15:01:38
大整数加法,数值的每一位作为栈的一项存放在栈中,从栈底到栈顶依次是数值的高位到低位。算法描述 :加数倒序存放在栈中(即栈顶是数的最低位,栈底是数的最高位)。 计算的时候,依次弹出栈中的数据,对每一位执行加操作;若遇到进位,则将进位标志carry设置为1,以在进行下一位计算的时候将其加上。 进位加结束
 1 /**
2 * 整数加法
3 *
4 * @param lv
5 * 左值
6 * @param rv
7 * 右值
8 * @param result
9 * 相加的结果
10 * @数值存放说明 数值的每一位作为栈的一项存放在栈中,从栈底到栈顶依次是数值的高位到低位
11 * @算法描述 输入的加数倒序存放在栈中(即栈顶是数的最低位,栈底是数的最高位)。 计算的时候,依次弹出栈中的数据,对每一位执行加操作。
12 * 若遇到进位,则将进位标志carry设置为1,以在进行下一位计算的时候将其加上。 进位加结束后,将carry的值重置为0。
13 * 每次计算都会检查进位标志carry的值
14 */
15 void plus(Stack<Integer> lv, Stack<Integer> rv, Stack<Integer> result) {
16 int sum = 0;
17 // 进位标志
18 int carry = 0;
19 while (true) {
20 try {
21 // 两个加数的长度都还不为0,继续分别在两个栈中取出一位相加
22 if (!lv.empty() && !rv.empty()) {
23 // 两个加数取出一位值相加,再加上进位(因为在有进位时carry=1,无进位时carry=0,根据任何数与0相加都等于0,所以可以直接加上)
24 sum = lv.pop() + rv.pop() + carry;
25 // 进位标志使用后,重置为0
26 carry = 0;
27 // 根据当前加数的和再加上进位的结果是否大于9(即10甚至更大,因为每一位加数的最大值只可能是9,所以这里最大也只能是18)
28 // 进行是否进位的判断依据,若大于9,将当前位相加的结果减去10,并将进位标志设置为1
29 if (sum > 9) {
30 sum -= 10;
31 carry = 1;
32 }
33 result.push(sum);
34 // 在两个加数的每一位都进行了计算后,判断是否还有进位,若有则加到结果的最高位
35 // 为了在两个加数位数(长度)不相等时能正确地计算,这个条件必需放在下面的两个条件前面
36 } else if (lv.empty() && rv.empty()) {
37 if (carry == 1)
38 result.push(carry);
39 return;
40 // 左值已经为空(每一位都参与了计算),而右值还不为空时,将右值的每一位取出加上进位值放到结果中
41 } else if (lv.empty()) {
42 sum = rv.pop() + carry;
43 carry = 0;
44 if (sum > 9) {
45 sum -= 10;
46 carry = 1;
47 }
48 result.push(sum);
49 // 同上面左值说明
50 } else if (rv.empty()) {
51 sum = lv.pop() + carry;
52 carry = 0;
53 if (sum > 9) {
54 sum -= 10;
55 carry = 1;
56 }
57 result.push(sum);
58 }
59 } catch (Exception e) {
60 System.err.println("栈溢出");
61 }
62 }
63 }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:JAVA 大整数加法的实现

关键词:java,大数,大整数,算法,加法,相加

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。