记一道算法题目(大整型数相减)

一、问题

   两个大整型数a和b,且a大于b,通过程序实现a-b的结果,输入和输出均使用字符串表示。

二、实现思路

    1.将两个大整型数存储在长度相同的数组中,小的数如果没有对应位,用0补全。

    2.从最低位开始逐位相减。

    3.输出结果(注意0开头的无效数字)

三、java实现

      

public class Test {

    private static ThreadLocal<String> user = new ThreadLocal<String>();


    public static void main(String[] args) {

//        user.set("hello world!");

//        System.out.println(user.get());
        String a = "848751910974194795641067106167401";
        String b = "817510571471174141974374347174199";
        System.out.println(getDiff(a, b));
    }

    private static String getDiff(String a, String b) {

        if (a.startsWith("0") || b.startsWith("0")) {
            throw new ArithmeticException("输入的大数字不能以0开头!");
        }

        //补全处理(小的数字补全 方便计算)
        if (a.length() >= b.length()) {
            StringBuilder sb = new StringBuilder();
            for (int k = 0; k < (a.length() - b.length()); k++) {
                sb.append("0");
            }
            b = sb.toString() + b;
        } else {
            throw new ArithmeticException("b的位数不能比a大!");
        }

        char[] bigChars = a.toCharArray();
        char[] smallChars = b.toCharArray();

        int[] big = new int[bigChars.length];
        int[] small = new int[bigChars.length];
        for (int i = bigChars.length - 1; i >= 0; i--) {
            //大数赋值
            big[bigChars.length - 1 - i] = Integer.valueOf(String.valueOf(bigChars[i]));
            //小数赋值
            small[bigChars.length - 1 - i] = Integer.valueOf(String.valueOf(smallChars[i]));
        }

        if (small[big.length - 1] > big[big.length - 1]) {
            throw new ArithmeticException("b不能比a大!");
        }

        //进行减法计算
        int[] result = new int[big.length];
        boolean carry = false;
        for (int j = 0; j < big.length; j++) {
            int bigNum = big[j];
            int smallNum = small[j];
            if (carry) {
                //本位被借位过
                if (bigNum == 0) {
                    bigNum = 9;
                } else {
                    bigNum = bigNum - 1;
                    carry = false;
                }
            }

            if (bigNum >= smallNum) {
                result[j] = bigNum - smallNum;
            } else {
                result[j] = bigNum + 10 - smallNum;
                carry = true;
            }
        }

        //返回结果组装
        StringBuilder resultSb = new StringBuilder();
        for (int m = result.length - 1; m >= 0; m--) {
            resultSb.append(result[m]);
        }

        String diff = resultSb.toString();
        if (!diff.startsWith("0")) {
            return diff;
        }

        //去掉结果头部的数字0
        return removeHeadZero(diff);
    }

    private static String removeHeadZero(String diff) {
        if (diff.startsWith("0")) {
            diff = diff.substring(1);
            return removeHeadZero(diff);
        } else {
            return diff;
        }
    }

}

 

posted @ 2021-01-25 20:25  咸鱼皮克斯  阅读(115)  评论(0编辑  收藏  举报