【算法】两个大数(数组)求和

学而不思则罔,思而不学则殆

【算法】两个大数<数组>求和


题目

输入:A = “999999” 和 B = “1”
返回:result = “1000000”

思路

主要是解决整型溢出的大数运算,主要思路:从最低位开始求和,本位等于求和的余数,进位提供给下一位求和使用。【默认进位为0】

Demo

    static char[] sum(char[] A, char[] B) {
        int flag = 0;
        //1.计算数组的长度为最大的值
        int max = Math.max(A.length, B.length);
        //2.返回的数组长度为最大值+1(因为可能产生进位)
        char[] sumChar = new char[max + 1];
        //3.求和数组下标(从末尾开始)
        int sumIndex = sumChar.length - 1;
        int aIndex = A.length - 1, bIndex = B.length - 1;
        //4.循环求和
        for (; aIndex >= 0 && bIndex >= 0; ) {
            //计算数字
            char aCh = A[aIndex--];
            char bCh = B[bIndex--];
            //求和 a+b+flag;
            int tmpSum = Integer.parseInt("" + aCh) + Integer.parseInt("" + bCh) + flag;
            sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
            flag = tmpSum / 10;
        }

        //5.处理未处理的数组A
        for (; aIndex >= 0; ) {
            //求和 a+flag;
            char aCh = A[aIndex--];
            int tmpSum = Integer.parseInt("" + aCh) + flag;
            sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
            flag = tmpSum / 10;
        }
        //6.处理未处理的数组B
        for (; bIndex >= 0; ) {
            //求和 b+flag;
            char bCh = B[bIndex--];
            int tmpSum = Integer.parseInt("" + bCh) + flag;
            sumChar[sumIndex--] = (char) (tmpSum % 10 + '0');
            flag = tmpSum / 10;
        }
        //7.处理最高为的进位
        sumChar[sumIndex] = (char) (flag + '0');
        return sumChar;
    }

算法思路如下:

  1. 计算数组的长度为最大的值
  2. 返回的数组长度为最大值+1(因为可能产生进位)
  3. 求算法开始的初始下标(从末尾开始)
  4. 循环求和
  5. 处理未处理完的数组(A|B)
  6. 处理最高为的进位

最终返回的数据没有做处理,比如剔除最高位为0的情况。

测试

测试产生进位

        char[] A = new char[]{'9', '9', '9', '9', '9', '9', '9'};
        char[] B = new char[]{'1'};
        char[] sum = sum(A, B);
        System.out.println(Arrays.toString(sum));

结果如下:

[1, 0, 0, 0, 0, 0, 0, 0]

测试二

        A = new char[]{'0', '9', '9', '9', '9', '9', '9'};
        B = new char[]{};
        sum = sum(A, B);
        System.out.println(Arrays.toString(sum));

结果如下:

[0, 0, 9, 9, 9, 9, 9, 9]

测试三

        A = new char[]{'1', '2', '3', '4', '5', '6', '7'};
        B = new char[]{'7', '6', '5', '4', '3', '2', '1'};
        sum = sum(A, B);
        System.out.println(Arrays.toString(sum));

结果如下:

[0, 8, 8, 8, 8, 8, 8, 8]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值