首页 > 试题广场 >

大数加法

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

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

输入

"1","99"

输出

"100"

说明

1+99=100       
示例2

输入

"114514",""

输出

"114514"
好臭的示例2(恼
发表于 2022-03-30 14:55:15 回复(2)
非本人所想,从网上看到的实现方法,感觉十分优雅,就分享一下
 function solve(a,b){
    var res='', c=0;
    a = a.split('');
    b = b.split('');
    while (a.length || b.length || c){
        c += ~~a.pop() + ~~b.pop();
        res = c % 10 + res;
        c = c>9;
    }
    return res.replace(/^0+/,'0');
}
说一下思路
1. 通过 split 将 a 和 b 转为数组;

2. while 循环进行判断,如果 a 数组或 b 数组不为空,或 c 值存在,则继续循环;

3. 通过 pop 方法去除数组的最后一项,并拿到最后一项的返回值,进行相加,传给 c 。
但此处要注意的一点是:因为 a 和 b 的长度不相同,所以 a 或 b 的数组元素可能为 undefined ,而数字加 undefined 的值为 NaN ,为了避免此情况,可以使用 ~~undefined 将 undefined 转换为 0 ;

4. 对 c 取余,拼接到 res 字符串的前面;

5. 之后对 c 进行判断,如果 c 大于 9 ,则 c 为 true, 进入下一轮循环。( c 在进行下一轮相加时,会从 true 转换为 1,因此就达到了进一的效果 ) 

总结:
拿出 a 数组和 b 数组的最后一项并与 c 相加赋给 c , 再对 c 取余拼接到 res 前面。
对 c 进行判断并赋予布尔值,之后循环
发表于 2020-11-26 21:13:59 回复(5)
//好方法
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
       if(s==null||"".equals(s)){
           return t;
       }
       if(t==null||"".equals(t)){
           return s;
       }
       int i=s.length()-1;
       int j=t.length()-1;
       int m1=0,m2=0,carray=0;//进位
       StringBuilder sb = new StringBuilder();
       while(i>=0||j>=0){
           if(i>=0){
               m1=s.charAt(i)-'0';
           }else{
               m1=0;
           }
           if(j>=0){
                m2=t.charAt(j)-'0';
           }else{
                m2=0;
           }
           int sum=m1+m2+carray;
           carray=sum/10;
           sb.append((char)((sum%10)+'0'));
           i--;
           j--;
       }
       if(carray!=0) sb.append('1');
       sb.reverse();
       return sb.toString();
    }
}

发表于 2021-01-22 21:12:33 回复(5)
人生苦短,我用Python
class Solution:
    def solve(self , s , t ):
        # write code here
        ans = eval(s)+eval(t)
        return str(ans)
发表于 2021-04-19 20:18:09 回复(2)
 public static String solution(String s,String t){
        int slen = s.length()-1;
        int tlen = t.length()-1;
        int carry = 0;
        StringBuffer sb = 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;
            int num = (snum+tnum+carry)%10;
            carry = (snum+tnum+carry)/10;
            sb.append(num);
            slen--;
            tlen--;
        }
        return sb.reverse().toString();
    }
发表于 2021-07-12 23:54:32 回复(9)
就是简单的模拟小学加法即可,不需要太复杂
双指针,重点是学习语法,get到知识点 StringBuilder的用法
import java.util.*;
class Solution {
    public String solve(String num1, String num2) {
        StringBuilder s=new StringBuilder();
        int i=num1.length()-1,j=num2.length()-1;int add=0;
        for(;i>=0||j>=0||add!=0;i--,j--)
        {
            int n1=i>=0?num1.charAt(i)-'0':0;
            int n2=j>=0?num2.charAt(j)-'0':0;
            s.append((n1+n2+add)%10);
            add=(n1+n2+add)/10;
        }
        s.reverse();
        return s.toString();
    }
}

发表于 2021-03-28 09:38:26 回复(2)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        
        
        string ans = "";
        int carry = 0;
        
        for(int i=s.size()-1, j=t.size()-1; i>=0 || j>=0; i--, j--){
            int x = i < 0 ? 0 : s[i] - '0';
            int y = j < 0 ? 0 : t[j] - '0';
            
            int sum = x + y + carry;
            carry = sum / 10;
            ans = to_string(sum % 10) + ans;
        }
        
        if(carry > 0)
            ans = '1' + ans;
        
        return ans;
    }
};

编辑于 2020-09-30 22:33:41 回复(2)
  • 算法
    • 1.保证s是较长的字符串,t是较短的字符串;如果不是,交换之
    • 2.用StrngBuilder保存计算结果,remainder保留进位;逐位计算和,计算到t字符串结束,每次计算和记得加上进位
    • 3.计算s比t多出的字符,同样记得加上进位
    • 4.最后如果进位不为0,结果还要加上进位
    • 5.得到的字符串翻转即是答案
public String solve (String s, String t) {
    if (s.length() < t.length()) {
        String temp = s;
        s = t;
        t = temp;
    }

    StringBuilder sb = new StringBuilder();
    int longLength = s.length();
    int shortLength = t.length();
    int carry = 0;
    for (int i = 0; i < shortLength; i++) {
        int add = (s.charAt(longLength-1-i) - '0') + (t.charAt(shortLength-1-i) - '0') + carry;
        sb.append(add % 10);
        carry = add / 10;
    }
    for (int i = shortLength; i < longLength; i++) {
        int add = (s.charAt(longLength-1-i) - '0') + carry;
        sb.append(add % 10);
        carry = add / 10;
    }
    if (carry != 0) {
        sb.append(carry);
    }
    return sb.reverse().toString();
}
编辑于 2020-10-03 23:44:01 回复(3)
按照题意,用比较老实的做法(自己造轮子)。
(1)通过前补0的方式,先对齐两个字符串数字的长度,并且在这个长度上加上一位,作为备用进位。
之后,两两对应位置,进行相加,判断和是否大于10:
(2)大于10则前一位进位加1,本位留个位数字。
(3)小于10则直接相加,留下。
(4)最终检查一下首位是否为0(为0,代表无进位,删除首位字符即可)
最后,返回答案字符串
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        
        int max_length = s.length() > t.length() ? s.length() + 1 : t.length() + 1;        
        string temp_zero1(max_length - s.length(), '0');
        s = temp_zero1 + s;   //对s补0操作
        string temp_zero2(max_length - t.length(), '0');
        t = temp_zero2 + t;    //对t补0操作

        string ans;
        char temp_num[2];
        temp_num[1] = '\0';
        for (int i = s.length() - 1; i >= 0; i--) //从最末一位开始往前加
        {
            if ((s[i] - '0') + (t[i] - '0') >= 10) //有进位
            {
                s[i - 1] = s[i - 1] + 1; // 进一位
                temp_num[0] = '0' + ((s[i] - '0') + (t[i] - '0') - 10);
                ans.insert(0, temp_num);
            }
            else //无进位
            {
                temp_num[0] = '0' + (s[i] - '0') + (t[i] - '0');
                ans.insert(0, temp_num);
            }
        }

        if (ans[0] == '0')
            ans = ans.erase(0, 1);
        return ans;
    }
};


编辑于 2020-12-16 15:09:39 回复(2)
    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;
        }
        StringBuilder result = new StringBuilder();
        int i = s.length()-1;//表示s的下标
        int j = t.length()-1;//表示t的下标
        int carry = 0;//表示进位
        //从后往前分别遍历两个字符串,把对应位置的数字进行相加
        while(i >= 0 || j >= 0 || carry != 0){
            //如果越界的话就取0,否则就取对应下标的数字
            int num1 = i >= 0?s.charAt(i)-'0':0;
            int num2 = j >= 0?t.charAt(j)-'0':0;
            //不要忘记加进位
            int sum = num1 + num2 + carry;
            //更新进位
            carry = sum / 10;
            //更新结果
            result.append(sum%10);
            //更新下标
            i--;
            j--;
        }
        //最后要对result进行逆序
        return result.reverse().toString();
    }


编辑于 2023-06-19 16:38:33 回复(2)
import java.util.*;
import java.math.BigDecimal;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    public String solve(String s, String t) {
        // write code here
        BigDecimal bigDecimal = new BigDecimal(s);
        BigDecimal bigDecimal2 = new BigDecimal(t);
        BigDecimal add = bigDecimal.add(bigDecimal2);
        return add + "";
    }
}
大数加法,有手就行(  hr:  出门左转=======>>>>>>>>>>>>>> )
发表于 2021-07-27 15:17:53 回复(3)
这个示例怎么这么臭啊

发表于 2021-11-14 17:13:23 回复(1)
简洁的双指针
import java.util.*;

public class Solution {
    public String solve (String s, String t) {
        if(s==null||"".equals(s))return t;
        if(t==null||"".equals(t))return s;
        
        int i=s.length()-1,j=t.length()-1;
        StringBuilder ans=new StringBuilder();
        int c=0;
        
        while(i>=0||j>=0){
            int c1=(i>=0?s.charAt(i)-'0':0);
            int c2=(j>=0?t.charAt(j)-'0':0);
            
            ans.append((c+c1+c2)%10);
            c=(c1+c2+c)/10;
            i--;
            j--;
        }
        if(c!=0) ans.append(c);
        
        ans.reverse();
        return ans.toString();
    }
}
发表于 2021-03-13 12:58:40 回复(0)
两个字符串从后向前遍历,模拟加法,然后每次插入到一个新的字符串的头部,注意保存进位即可
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int i = s.size()-1, j = t.size()-1;
        string res;
        int c = 0;
        while(i >= 0 && j >= 0){
            int base = s[i] + t[j] - '0' + c - '0';
            res = res.insert(0, 1, base%10+'0');
            c = base/10;
            --i, --j;
        }

        while(i >= 0){
            int base = s[i] + c - '0';
            res = res.insert(0, 1, base%10+'0');
            c = base/10;
            --i;
        }
        while(j >= 0){
            int base = t[j] + c - '0';
            res = res.insert(0, 1, base%10+'0');
            c = base/10;
            --j;
        }
        if(c != 0) res = res.insert(0, 1, c+'0');

        return res;
    }
};








发表于 2021-03-07 19:39:20 回复(0)
 public String solve (String s, String t) {
        // write code here
        StringBuilder sb =new StringBuilder();
        int i =s.length()-1,j=t.length()-1,c=0;
        
        while(i>=0||j>=0||c!=0){
            int ii =i>=0? s.charAt(i--)-'0':0;
            int jj =j>=0?t.charAt(j--)-'0':0;
            c = ii+jj+c;
            sb.append(c%10);
            c /=10;
        }
        return sb.reverse().toString();
    }

发表于 2022-09-10 16:15:54 回复(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 ans=new StringBuilder();
        int tmp=0;
        int i=s.length()-1,j=t.length()-1;
        //从后往前遍历两个字符串
        while(i>=0&&j>=0){
            //把要相加的字符转换成数字
            int x=s.charAt(i)-48;
            int y=t.charAt(j)-48;
            //记录相加后的本位结果,并转回字符
            char z=(char)((x+y+tmp)%10);
            //记录相加后的进位结果
            tmp=(x+y+tmp)/10;
            //把本位的结果插入结果字符串中
            ans.insert(0,(char)(z+48));
            i--;
            j--;
        }
        //继续加完剩下的字符,记得要把进位加上
        while(i>=0){
            int x=s.charAt(i)-48;
            char z=(char)((x+tmp)%10);
            tmp=(x+tmp)/10;
            ans.insert(0,(char)(z+48));
            i--;
        }
        //继续加完剩下的字符,记得要把进位加上
        while(j>=0){
            int y=t.charAt(j)-48;
            char z=(char)((y+tmp)%10);
            tmp=(y+tmp)/10;
            ans.insert(0,(char)(z+48));
            j--;
        }
        //最后的进位不要忘记加上
        if(tmp!=0){
            ans.insert(0,(char)((char)tmp+48));
        }
        return ans.toString();
    }
}


发表于 2022-05-17 16:33:36 回复(0)
好臭的示例
发表于 2022-03-04 15:13:13 回复(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[] sChar = s.toCharArray();
        char[] tChar = t.toCharArray();
        int sLen = sChar.length - 1;
        int tLen = tChar.length - 1;
        int c = 0;
        while (sLen >= 0 || tLen >= 0 || c != 0) {
            int a = sLen >= 0 ? sChar[sLen--] - '0' : 0;
            int b = tLen >= 0 ? tChar[tLen--] - '0' : 0;
            int n = a + b + c;
            c = n / 10;
            sb.append(n % 10);
        }
        return sb.reverse().toString();
    }
}

发表于 2021-10-03 20:30:33 回复(0)
function solve( s ,  t ) {
    // write code here
    // 首先取出大数中长度最长的
    let maxLength = Math.max(s.length,t.length);
    // 用0 补齐长度
    s = s.padStart(maxLength,0);
    t = t.padStart(maxLength,0);
    // 定义加法过程中需要用到的变量
    let a = 0;
    let b = 0; //进位
    let sum = "";
    for( let i = maxLength - 1; i >=0; i--){
        a = parseInt(s[i]) + parseInt(t[i]) + b;
        b = Math.floor(a/10);
        sum = a%10 + sum;
    }
    if( b == 1){
        sum = "1" + sum;
    }
    return sum;

发表于 2021-08-02 21:28:19 回复(0)
// ==================== function prototype ====================
size_t str_len(const char * s);
void reverse(char * s, int len);
// ==================== function prototype ====================

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
 */
char* solve(char* s, char* t) {
  char* ans = (char*) calloc(100010, sizeof(char));
  int ansSize = 0;
  int i = str_len(s) - 1, j = str_len(t) - 1, sum = 0;
  
  while (i >= 0 || j >= 0 || sum) {
    sum += (i >= 0 ? s[i--] - 48 : 0) + (j >= 0 ? t[j--] - 48 : 0);
    *(ans + ansSize++) = sum % 10 + 48;
    sum /= 10;
  }
  reverse(ans, ansSize);
  return ans;
}

size_t str_len(const char * s) {
  if (!*s) return 0; 
  const char * p = s;
  while (*++p);
  return p - s;
}

void reverse(char * s, int len) {
  int l = -1, r = len;
  while (++l < --r) {
    *(s + l) ^= *(s + r);
    *(s + r) ^= *(s + l);
    *(s + l) ^= *(s + r);
  }
}

发表于 2021-07-08 20:21:44 回复(0)