淘先锋技术网

首页 1 2 3 4 5 6 7

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

数据范围:s.length,t.length≤100000,字符串仅由’0’~‘9’构成
示例1

输入:"1","99"
返回值:"100"
说明:1+99=100 

思路
大数相加,如果数据超过范围使用int类型相加会超界

采用竖式加法来相加,在java中使用栈来计算,首先使用补0的方法来使数据的长度一致,然后从数据的最后一位开始相加,如果数据长度大于10则进一位。
定义两个指针 i 和 j 分别指向 s 和 t 的末尾,即最低位,同时定义一个变量 carry维护当前是否有进位,然后从末尾到开头逐位相加即可。carry就是上一步相加结果的进位,上一步如果进位了就是1,如果没进位就是0。你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理。

方法一:使用栈

/**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        StringBuilder str = new StringBuilder();
        int i = s.length() - 1, j = t.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) {
            int x = i < 0 ? 0 : s.charAt(i--) - '0';
            int y = j < 0 ? 0 : t.charAt(j--) - '0';
            carry += x + y;
            stack.push(carry % 10);
            carry = carry / 10;
        }
        while (!stack.isEmpty()) {
            str.append(stack.pop());
        }
        return str.toString();

    }

方法二:暴力解法,使用JAVA类

	 /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
          BigInteger a=new BigInteger(s);
          BigInteger b=new BigInteger(t);
          return a.add(b).toString();
    }