首页 > 试题广场 >

大数加法

[编程题]大数加法
  • 热度指数:202543 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:,字符串仅由'0'~‘9’构成
要求:时间复杂度
示例1

输入

"1","99"

输出

"100"

说明

1+99=100       
示例2

输入

"114514",""

输出

"114514"
注释部分为性能与简洁的取舍吧
public
String solve (String s, String t) {
        // write code here
        if(s.isEmpty() || t.isEmpty()){
            return s + t;
        }

        String[] ss = s.split("");
        String[] tt = t.split("");
        // if (ss.length<tt.length){
        //     String[] gg = ss;
        //     ss = tt;
        //     tt = gg;
        // }
        int i = tt.length-1;
        int j = ss.length-1;
        StringBuilder builder = new StringBuilder();
        int nextNum = 0;
        do {
            int num = j>=0 ? Integer.parseInt(ss[j--]) : 0;
            int num2 = i>=0 ? Integer.parseInt(tt[i--]) : 0 ;
            int result = num2 + num + nextNum;
            nextNum = packResult(result, builder);
        }while ( i>=0 || j>=0 || nextNum == 1 );
        // }while ( i>=0 || nextNum == 1 );
        // if (j>0){
        //     builder.insert(0,s.substring(0,j+1));
        // }
        return builder.toString();
    }

    public int packResult(int result , StringBuilder builder){
        if (result>9){
            result = result-10;
            builder.insert(0,result);
            return 1;
        }else {
            builder.insert(0,result);
            return 0;
        }
    }
发表于 2025-04-13 18:58:40 回复(0)
import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        int temp=0,a=0,b=0;
        StringBuffer result=new StringBuffer();
        for(int i=s.length()-1,j=t.length()-1;i>=0&&j>=0||temp>0;i--,j--)
        {
            a=i>=0?s.charAt(i)-'0':0;//若两数位数不一致 其中一个取不到字符的时候处理成0再相加
            b=j>=0?t.charAt(j)-'0':0;//同上                       
            result.append((a+b+temp)%10);
            temp=(a+b+temp)/10;             
        }
        return result.reverse().toString();
    }
}

发表于 2025-04-11 14:01:51 回复(0)
通过栈的后进先出。模拟加法运算
import java.util.*;


public class Solution {
    public String solve(String s, String t) {
        Stack<Character> sStack = new Stack<>();
        Stack<Character> tStack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            sStack.push(s.charAt(i));
        }
        for (int i = 0; i < t.length(); i++) {
            tStack.push(t.charAt(i));
        }
        StringBuilder res = new StringBuilder();
        //当前需要进位的值
        int inter = 0;
        while (!sStack.isEmpty() || !tStack.isEmpty() || inter > 0) {
            int sPop = !sStack.isEmpty() ? sStack.pop() - '0' : 0;
            int tPop = !tStack.isEmpty() ? tStack.pop() - '0' : 0;
            //先计算非进位的值
            int cul = sPop + tPop;
            //计算进位的值
            cul = cul + inter;
            int x = (cul % 10);
            res.insert(0, x);
            inter = cul / 10;
        }
        return res.toString();
    }
}


发表于 2025-03-21 17:44:57 回复(0)
屬於是用高級語言實現一個全加器
學過數字電路的都會做
发表于 2025-03-14 11:19:34 回复(0)
public String solve1(String s, String t) {
        if (s.isEmpty()) {
            return t;
        }
        if (t.isEmpty()) {
            return s;
        }
        BigInteger num1 = new BigInteger(s);
        BigInteger num2 = new BigInteger(t);
        BigInteger result = num1.add(num2);
        return result.toString();
    }
public String solve2(String s, String t) {
        if (s.isEmpty()) {
            return t;
        }
        if (t.isEmpty()) {
            return s;
        }
        // 令较长的字符为s
        if (s.length() < t.length()) {
            String temp = s;
            s = t;
            t = temp;
        }
        // 考虑进位,结果数组长度最多比 s 多 1
        char[] ans = new char[s.length()];
        int carry = 0;
        int i = s.length() - 1;
        int j = t.length() - 1;
        int index = s.length() - 1;
        while (i >= 0 || j >= 0) {
            int val = carry;
            if (i >= 0) {
                val += s.charAt(i) - '0';
                i--;
            }
            if (j >= 0) {
                val += t.charAt(j) - '0';
                j--;
            }
            // 处理进位
            carry = val / 10;
            val = val % 10;
            // 加入结果数组
            ans[index] = (char) (val + '0');
            index--;
        }
        String res = new String(ans);
        if (carry == 1) {
            res = "1" + res;
        }
        return res;
    }

发表于 2025-03-10 16:51:08 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here

        // 0.处理特殊情况
        if (s.length() == 0) {
            return t;
        }
        if (t.length() == 0) {
            return s;
        }

        // 1.按位加,注意进位
        StringBuilder sb = new StringBuilder();
        int i = 0;
        int sl = s.length();
        // 字符串s的实际下标,从后往前
        int si = sl - 1 - i;
        int tl = t.length();
        // 字符串t的实际下标,从后往前
        int ti = tl - 1 - i;
        // 进位
        int add = 0;
        while (si >= 0 || ti >= 0) {
            // si和ti有一个大于等于0即继续运算
            int sn = 0;
            if (si >= 0) {
                sn = s.charAt(si) - '0';
            }
            int tn = 0;
            if (ti >= 0) {
                tn = t.charAt(ti) - '0';
            }
            // 运算
            int sum = sn + tn + add;
            int res = sum % 10;
            add = sum / 10;
            // 使用StringBuilder的insert方法进行前插 - sb.insert(0, "前插的内容")
            // 使用String的静态方法valueOf进行字符串化(序列化) - String.valueOf(数字)
            sb.insert(0, String.valueOf(res));
            // 更新si和ti
            i++;
            si = sl - 1 - i;
            ti = tl - 1 - i;
        }
        // 此时si和ti全小于0,若进位还有值,则将其加到前面
        if (add > 0) {
            sb.insert(0, String.valueOf(add));
        }
        return sb.toString();
    }
}

发表于 2024-11-17 18:49:33 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        StringBuilder res = new StringBuilder();
        int carry = 0;  // 处理进位
        int i = s.length() - 1, j = t.length() - 1;
        while (i >= 0 && j >= 0) {
            int si = s.charAt(i) - '0';
            int ti = t.charAt(j) - '0';

            int sum = si + ti + carry;
            res.append(sum % 10);
            carry = sum / 10;
            i--;
            j--;
        }
        while (i >= 0) {
            int sum = s.charAt(i) - '0' + carry;
            carry = sum / 10;
            res.append(sum % 10);
            i--;
        }
        while (j >= 0) {
            int sum =  t.charAt(j) - '0' + carry;
            carry = sum / 10;
            res.append(sum % 10);
            j--;
        }
        if(carry!=0){
           res.append(carry); 
        }
        return new StringBuilder(res).reverse().toString();
    }
}

发表于 2024-05-10 22:55:10 回复(0)
public String solve (String s, String t) {
    // write code here
    StringBuilder res=new StringBuilder();
    int sum=0 ,sl=s.length()-1 ,tl=t.length()-1;
    while(sl>=0 || tl>=0 || sum>0){
        if(sl>=0){
            sum+=(s.charAt(sl--)-'0');
        }
        if(tl>=0){
            sum+=(t.charAt(tl--)-'0');
        }
        res.append(sum%10);
        sum/=10;
    }
    return res.reverse().toString();
}

发表于 2024-04-21 14:46:42 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        if (s == null || s.length() == 0) return t;
        if (t == null || t.length() == 0) return s;
        int lenS = s.length();
        int lenT = t.length();
        // 用于拼接计算过程中产生的结果
        StringBuilder sb = new StringBuilder();
        // 记录进位数
        int car = 0;
        // 记录s、t和car相加的和
        int temp = 0;
        // s、t任意一个字符串未遍历结束时,不断循环,从尾部开始遍历
        while (lenS - 1 >= 0 || lenT - 1 >= 0) {
            // 分别记录s、t的字符
            char ch1 = '0', ch2 = '0';
            // 进行判断防止越界
            if (lenS - 1 >= 0) ch1 = s.charAt(lenS - 1);
            if (lenT - 1 >= 0) ch2 = t.charAt(lenT - 1);
            // 两串都未遍历至首字符时,将遍历过程中得到的字符转换成数字后相加,并加上进位数
            if (lenS - 1 >= 0 && lenT - 1 >= 0) temp = (ch1 - '0') + (ch2 - '0') + car;
            // t遍历遍历结束,s未遍历结束时,只需要考虑s的当前字符与进位数相加
            else if (lenS - 1 >= 0) temp = (ch1 - '0')  + car;
            // s遍历遍历结束,t未遍历结束时,只需要考虑t的当前字符与进位数相加
            else if (lenT - 1 >= 0) temp = (ch2 - '0')  + car;
            // 获取进位数,用于下轮循环相加,或循环结束后的拼接
            car = temp / 10;
            // 拼接进位相加后的个位数
            sb.append(temp % 10);
            lenS--;
            lenT--;
        }
        // 如1+99,循环结束时sb=00,car=1,应拼接car,拼接后sb=001
        if (car != 0) sb.append(car);
        // 反转,因为拼接结果是反向的
        return sb.reverse().toString();
    }
}

发表于 2023-11-03 12:15:08 回复(0)
测试用例蠢**找茬
编辑于 2023-10-18 17:28:20 回复(0)
竟然过不了,服了,感觉跟他们写的一样啊
public String solve (String s, String t) {
        // write code here
        Stack<Integer> stack=new Stack();
        int i=s.length()-1;
        int j=t.length()-1;
        int num=0;
        int num1=0;
        while(j>=0||i>=0){
            num+=(i<0?0:s.charAt(i)-'0');
            num1=(j<0?0:t.charAt(j)-'0');
            stack.push((num+num1)%10);
            num=(num+num1)/10;
            j--;
            i--;
        }
        if(num==1){
            stack.push(num);
        }
        
        String s1="";
        while(!stack.isEmpty()){
            s1+=stack.pop();
        }
        return s1;
    }

发表于 2023-10-06 09:48:05 回复(1)
public String solve (String s, String t) {
        int slen = s.length() - 1;
        int tlen = t.length() - 1;
        //  进位符carry
        int carry = 0;
        //  StrBuffer 可变长字符串
        StringBuffer st = new StringBuffer();
        while (slen >= 0 || tlen >= 0 || carry > 0) {
            int snum = slen >= 0 ? s.charAt(slen) - '0' : 0;
            int tnum = tlen >= 0 ? t.charAt(tlen) - '0' : 0;
            //  num为sum+tnum+进位然后取余
            int num = (snum + tnum + carry) % 10;
            //  看carry是否有进位
            carry = (snum + tnum + carry) / 10;
            //  存入sb
            st.append(num);
            //  不断向前
            slen--;
            tlen--;
        }
        return st.reverse().toString();
    }
发表于 2023-08-28 08:20:31 回复(0)
public String solve (String s, String t) {
        // write code here
        if (s == null || t == null) {
            return s == null ? t : s;
        }
        int carry = 0;
        int i = s.length() - 1;
        int j = t.length() - 1;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0 || carry != 0) {
            int intI = i >= 0 ? s.charAt(i--) - '0' : 0;
            int intJ = j >= 0 ? t.charAt(j--) - '0' : 0;
            carry = carry + intI + intJ;
            sb.append(carry % 10);
            carry /= 10;
        }
        return sb.reverse().toString();
    }

发表于 2023-08-26 14:07:18 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // 1. 参数判断
        if(s == null || s.length() == 0) {
            return t;
        }
        if(t == null || t.length() == 0) {
            return s;
        }

        // 2. 创建 carry 变量表示进位信息
        int carry = 0;

        // 3. 创建 StringBuilder 用来接收答案
        StringBuilder stringBuilder = new StringBuilder();


        // 4. 创建 i j 分别指向两个字符串
        // 因为我们是从后往前操作,所以让 i j 先都指向最后面
        int i = s.length() - 1;
        int j = t.length() - 1;

        // 5. i j 从最后面往前移动
        while(i >= 0 || j >= 0) {
            // 6. num1 就表示 s 这一位的值
            int num1 = i < 0 ? 0 : s.charAt(i) - '0';
            // 判断完这一位,i 要往前移动
            i--;

            // 7. num2 就表示 t 这一位的值
            int num2 = j < 0 ? 0 : t.charAt(j) - '0';
            // 判断完这一位,j 要往前移动
            j--;

            // 8. 将这两位的值相加
            // 注意:我们还应该添加进位信息
            int sum = num1 + num2 + carry;
            
            // 9. 将 sum 的结果添加到 stringBuilder 中
            stringBuilder.insert(0,sum % 10);

            // 10. 判断是否有进位
            carry = (sum / 10);
        }

        // 11. 判断最后是否还有进位
        if(carry != 0) {
            stringBuilder.insert(0,1);
        }
        
        return stringBuilder.toString();
    }
}

发表于 2023-07-29 16:20:58 回复(0)
import java.util.*;

import java.math.BigInteger;
//
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        // write code here
        BigInteger a = new BigInteger(s);
        BigInteger b = new BigInteger(t);
        BigInteger c = a.add(b);
        return c.toString();
    }
}
发表于 2023-03-26 17:14:10 回复(0)
import java.math.BigInteger;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        BigInteger sBigInteger = new BigInteger(s);
        BigInteger tBigInteger = new BigInteger(t);
        BigInteger add = sBigInteger.add(tBigInteger);
        return add.toString();
    }
}

发表于 2023-03-19 12:44:13 回复(0)
import java.util.*;


public class Solution {
    public String solve (String s, String t) {
        if (s == "") return t;
        if (t == "") return s;
        Stack<Integer> st = new Stack<>();
        int carry = 0;
        for (int i=s.length()-1,j=t.length()-1;i>=0&&j>=0;i--,j--) {
            char c1 = s.charAt(i);
            char c2 = t.charAt(j);
            int cur = (c1 - '0' + c2 - '0' + carry) % 10;
            carry = (c1 - '0' + c2 - '0' + carry) / 10;
            st.add(cur);
        }
        String temp = s.length() > t.length() ? s : t;
        for (int i = Math.abs(s.length()-t.length()) - 1; i >= 0; i--) {
            char c = temp.charAt(i);
            int cur = (c - '0' + carry) % 10;
            carry = (c - '0' + carry) / 10;
            st.add(cur);
        }
        if (carry == 1)
            st.add(carry);
        StringBuffer sb = new StringBuffer();
        while (!st.isEmpty()) {
            sb.append(st.pop());
        }
        return sb.toString();
    }
}

发表于 2023-03-18 15:29:52 回复(0)
import java.util.*; 

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        StringBuilder sb = new StringBuilder();
        char[] cs = s.toCharArray();
        char[] ct = t.toCharArray();
        int us = cs.length - 1, ut = ct.length - 1;
        int cout = 0, sum = 0;
        while (us >= 0 || ut >= 0) {
            sum = cout;
            if (us >= 0) sum += (cs[us--] - '0');
            if (ut >= 0) sum += (ct[ut--] - '0');
            if (sum >= 10) {
                sum -= 10;
                cout = 1;
            } else {
                cout = 0;
            }
            sb.append(sum);
        }
        if (cout > 0) sb.append(1);
        return sb.reverse().toString();

    }
}

发表于 2023-03-05 19:36:16 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here
        int n1 = s.length(), n2 = t.length();
        if (n1 == 0 || n2 == 0) {
            return n1 == 0 ? t : s;
        }
        StringBuilder ans = new StringBuilder();
        int carry = 0;
        int t1, t2, sum = 0;
        int p1 = n1 - 1, p2 = n2 - 1;
        while (p1 >= 0 || p2 >= 0 || carry > 0) {
            if (p1 < 0) {
                t1 = 0;
            } else {
                t1 = s.charAt(p1) - '0';
            }
            if (p2 < 0) {
                t2 = 0;
            } else {
                t2 = t.charAt(p2) - '0';
            }
            sum = t1 + t2 + carry;
            carry = sum / 10;
            sum = sum % 10;
            ans.append(Integer.toString(sum));
            p1--;
            p2--;
        }
        ans = ans.reverse();
        return ans.toString();
    }
}

发表于 2023-03-01 15:15:57 回复(0)