前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记录一个当时没有做出来的超大数相加

记录一个当时没有做出来的超大数相加

作者头像
103style
发布2022-12-19 13:56:34
1690
发布2022-12-19 13:56:34
举报
文章被收录于专栏:Android开发经验分享

转载请以链接形式标明出处: 本文出自:103style的博客

主要是 一个 正数 一个负数的情况。 保证测试用例 输入字符串是正常的正负整数。 正负数的字符串长度 不超过 10^9.

代码语言:javascript
复制
public class LeetCode {
    public static void main(String[] args) {
        System.out.println(new LeetCode().addString("-12312", "12312"));
        System.out.println(-12312 + 12312);

        System.out.println(new LeetCode().addString("-145", "12312"));
        System.out.println(-145 + 12312);

        System.out.println(new LeetCode().addString("154545", "954545"));
        System.out.println(154545 + 954545);

        System.out.println(new LeetCode().addString("123", "5689"));
        System.out.println(123 + 5689);

        System.out.println(new LeetCode().addString("-123", "-5689"));


    }

    public String addString(String a, String b) {
        if ((a.charAt(0) == '-') != (b.charAt(0) == '-')) {
            // 一正一负
            if (a.charAt(0) == '-') {
                return check(a, b);
            } else {
                return check(b, a);
            }
        } else if (a.charAt(0) == '-' && b.charAt(0) == '-') {
            //都是负数
            return "-" + addString(a.substring(1), b.substring(1));
        }
        //都是正数
        char[] arr1 = a.toCharArray();
        char[] arr2 = b.toCharArray();
        int len = Math.max(arr1.length, arr2.length) + 1;
        int[] res = new int[len];
        int t = 0;
        for (int i = len - 1; i >= 0; i--) {
            int indexA = (arr1.length - (len - i));
            int indexB = (arr2.length - (len - i));
            int numA = indexA < 0 ? 0 : (arr1[indexA] - '0');
            int numB = indexB < 0 ? 0 : (arr2[indexB] - '0');
            t += numA + numB;
            res[i] = t % 10;
            t = t / 10;
        }
        int i = 0;
        while (res[i] == 0) i++;
        StringBuilder builder = new StringBuilder();
        while (i < len) builder.append(res[i++]);
        return builder.toString();
    }

    private String check(String negative, String positive) {
        if (negative.length() - 1 > positive.length()) {
            return "-" + sub(negative.substring(1), positive);
        } else if (negative.length() - 1 < positive.length()) {
            return sub(positive, negative.substring(1));
        } else {
            for (int i = 0; i < positive.length(); i++) {
                if (negative.charAt(i + 1) > positive.charAt(i)) {
                    return "-" + sub(negative.substring(1), positive);
                } else if (negative.charAt(i + 1) < positive.charAt(i)) {
                    return sub(positive, negative.substring(1));
                }
            }
            return "0";
        }
    }


    private String sub(String a, String b) {
        //a > b 求 a - b
        char[] arrA = a.toCharArray();
        char[] arrB = b.toCharArray();
        int t = 0;
        for (int i = 0; i < arrA.length; i++) {
            int index = arrB.length - 1 - i;
            int numB = index < 0 ? 0 : (arrB[arrB.length - 1 - i] - '0');
            int numA = arrA[arrA.length - 1 - i] - '0';
            t = numA - numB - t;
            if (t >= 0) {
                arrA[arrA.length - 1 - i] = (char) ('0' + t);
                t = 0;
            } else {
                arrA[arrA.length - 1 - i] = (char) ('0' + (10 + t));
                t = 1;
            }
        }
        return new String(arrA);
    }
}


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档