字符串之大数加法

题目描述

描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length \le 100000s.length,t.length≤100000,字符串仅由’0’~‘9’构成
要求:时间复杂度 O(n)O(n)

思路:

借助整型数组和模拟数学加法计算:

在这里插入图片描述

package test;

public class BigAdd1 {
    public static void main(String[] args) {
        BigAdd1 bigAdd1 = new BigAdd1();
        String solve = bigAdd1.solve("459309139", "733064366");
        System.out.println(solve);
    }
    //大数加法,借助数组完成,使用数学模拟法
    public static String solve (String s, String t) {
        int longLen = s.length() > t.length() ? s.length() : t.length();
        int shortLen = s.length() <= t.length() ? s.length() : t.length();
        int[] res = new int[longLen +1];// 用于存最终数据的
        //反转2个字符串
        StringBuffer reverse_s = new StringBuffer(s).reverse();
        StringBuffer reverse_t = new StringBuffer(t).reverse();
        //求两个字符串中一个长的,一个短的,备用
        StringBuffer shortStr = 
                reverse_s.length()< reverse_t.length() ? reverse_s :  reverse_t;
        StringBuffer longStr = 
                reverse_s.length()>=reverse_t.length() ? reverse_s :  reverse_t;
        //将短的字符串补位0 和长字符串一样长度,方便相加
        for (int i = shortLen; i < longLen; i++) {
            shortStr.append("0");
        }

        int up=0;//开始的进位,up代表进位
        for (int i = 0; i < longLen; i++) {
            //将每位相加的数存在数字res中
            res[i]=(shortStr.charAt(i)-'0')+(longStr.charAt(i)-'0') + up;
            up = res[i]/10;
            res[i] = res[i]%10;
        }
        //最后的进位
        if(up!=0){
            res[longLen] = up;
        }
        //将数组转成字符串
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < res.length; i++) {
            buffer.append(res[i]);
        }
        String s1 = buffer.reverse().toString();
        //去掉字符串前面的0
        if(s1.charAt(0)=='0'){
            return s1.substring(1);
        }else{
            return s1;
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_38568503/article/details/128201481