两个大数相加

题目:两个大数相加,都是正整数。

例如:

"1" + "2" = "3"
"11111111111111111111111111111111111111111111111111" + "11111111111111111111111111111111111111111111111111" = "22222222222222222222222222222222222222222222222222"

题型分类

  • 高精度运算

知识点

维基百科-高精度计算

解题思路

  1. 从低位往高位相加
  2. 每次相加前,正确处理前一次运算是否有进位

复杂度分析:

时间复杂度 O(n)
空间复杂度 O(n) 使用了数组、StringBuilder

    public String addBigNum(String val1, String val2) {
        if (val1 == null || "".equals(val1)) {
            return val2;
        }
        if (val2 == null || "".equals(val2)) {
            return val1;
        }

        int length1 = val1.length();
        int length2 = val2.length();
        int maxLength = length2;
        int minLength = length1;
        char[] maxArr = val2.toCharArray();
        char[] minArr = val1.toCharArray();

        if (length1 > length2) {
            maxLength = length1;
            minLength = length2;
            maxArr = val1.toCharArray();
            minArr = val2.toCharArray();
        }

        int[] nums = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        char zero = '0';
        boolean isCarry = false; // true 发生进位
        int[] resultArr = new int[maxLength + 1]; // +1因为可能进一位
        int resultIndex = resultArr.length - 1;
        int j = minLength - 1;
        for (int i = maxLength - 1; i > -1; i--) {
            int moreValue = maxArr[i];
            int lessValue = j > -1 ? minArr[j--] : 0;
            // 避免使用Integer因自动拆装带来的性能损失
            int addVaue = nums[moreValue - zero] + nums[lessValue - zero];
            if (isCarry) {
                addVaue++;
            }

            if (addVaue > 9) {
                isCarry = true;
            } else {
                isCarry = false;
            }
            resultArr[resultIndex--] = addVaue % 10;
        }

        if (isCarry) {
            resultArr[0] = 1;
        }

        StringBuilder resStr = new StringBuilder();
        for (int i = isCarry ? 0 : 1; i < resultArr.length; i++) {
            resStr.append(resultArr[i]);
        }

        return resStr.toString();
    }

        // 测试
        System.out.println("2".equals(addBigNum("1", "1")) ? "OK" : "ERROR");
        System.out.println("246".equals(addBigNum("123", "123")) ? "OK" : "ERROR");
        System.out.println("240".equals(addBigNum("120", "120")) ? "OK" : "ERROR");
        System.out.println("500".equals(addBigNum("250", "250")) ? "OK" : "ERROR");
        System.out.println("4294967294".equals(addBigNum(Integer.MAX_VALUE + "", Integer.MAX_VALUE + "")) ? "OK" : "ERROR");
        System.out.println("18446744073709551614".equals(addBigNum(Long.MAX_VALUE + "", Long.MAX_VALUE + "")) ? "OK" : "ERROR");
        System.out.println("22222222222222222222222222222222222222222222222222"
                .equals(addBigNum("11111111111111111111111111111111111111111111111111",
                        "11111111111111111111111111111111111111111111111111")) ? "OK" : "ERROR");
        System.out.println("22222222222222222222222222222222222222222222222238"
                .equals(addBigNum("11111111111111111111111111111111111111111111111119",
                        "11111111111111111111111111111111111111111111111119")) ? "OK" : "ERROR");
        System.out.println("30222222222222222222222222222222222222222222222238"
                .equals(addBigNum("15111111111111111111111111111111111111111111111119",
                        "15111111111111111111111111111111111111111111111119")) ? "OK" : "ERROR");

补充说明

  • 直接使用 JDK 中的 BigInteger 的 add()方法,但知识有限,看不懂。
  • 入参、返回结果的最大位数是Integer.MAX_VALUE,因为String的最大长度是Integer.MAX_VALUE;Java中数组的最大长度也是Integer.MAX_VALUE。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值