超级大正整数的减法实现

作者: 西5d | 来源:发表于2019-02-02 14:01 被阅读1次

    要求实现明显超过整型以及其他计量的整数范围的减法。如有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();
            }
        }
    

    相关文章

      网友评论

        本文标题:超级大正整数的减法实现

        本文链接:https://www.haomeiwen.com/subject/xcyssqtx.html