超级大正整数的减法实现

要求实现明显超过整型以及其他计量的整数范围的减法。如有a,b的大型整数,规定了a>=b,求两个数相减的结果。代码如下,通过处理字符串,用字符的相减来实现,需要考虑几个边界条件。
其中,输入为a-b的格式,如:11111-2222,Linux下可以通过bc命令验证结果是否正确。首先处理输入数据,用除号拆分。再判断是否相等,相等直接返回,否则再做处理。
因此已知a>b,则len(a)>=len(b),记录两个标记位idxAidxB和一个借位标记k,在被减位小于等于减数时组合运算,以长度小的idxB为截止条件,依次从末尾比较。

1)当a当前位减去借位大于等于b当前位,下次不需要借位,k=0,结果为v(注意这里的处理是因为两个当前位相等且借位为1的情况,会使结果为-1);
2)当前需要借位,对应位相减同时加10,注意也要减去之前是否借位,结果为v;

如果len(a)>len(b),还得继续将a的剩余位数拼接到结果里,另外如果需要借位,即k==1,需要减一,并令k=0
最后,如果结果翻转后,首位为0,去除所有在首位的0,返回最终结果。

private static String minus(String line) {
        String[] strings = line.split("-");
        String a = strings[0];
        String b = strings[1];

        if (a.equals(b)) {
            return "0";
        }

        //a > b
        StringBuilder builder = new StringBuilder();
        int k = 0;
        int v;

        int idxA = a.length() - 1;
        int idxB = b.length() - 1;

        while (idxB>=0) {
            char chB = b.charAt(idxB--);
            char chA = a.charAt(idxA--);
            if (chA - k >= chB) {
                v = chA - chB - k;
                k = 0;
            } else {
                v = chA - chB + 10 - k;
                k = 1;
            }

            builder.append(v);
        }

        for (int i = idxA - idxB - 1; i >= 0; i--) {
            if (k == 1) {
                builder.append((char) (a.charAt(i) - 1));
                k = 0;
            } else {
                builder.append(a.charAt(i));
            }
        }

        StringBuilder builder1 = builder.reverse();
        if (builder1.charAt(0) == '0') {
            while (builder1.charAt(0) == '0') {
                builder1.delete(0, 1);
            }
            return builder1.toString();
        } else {
            return builder1.toString();
        }
    }
    原文作者:西5d
    原文地址: https://www.jianshu.com/p/cbaf29049d73
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞