列表

详情


BM86. 大数加法

描述

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

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

示例1

输入:

"1","99"

输出:

"100"

说明:

1+99=100

示例2

输入:

"114514",""

输出:

"114514"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 1260KB, 提交时间: 2021-04-03

static const auto io_sync_off = []()//lambda函数
{
    // turn off sync,关闭输入输出流的缓存
    std::ios::sync_with_stdio(false);
    // untie in/out streams,实现输入和输出流的解绑
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int l = s.length();
        int r = t.length();
        if(!l) return t;
        if(!r) return s;
        int carry = 0,tmp = 0;
        if(l<r){
            for(int n=r-l;n>0;n--)
                s = '0'+s;
            l=r;
        }else if(l>r){
            for(int n=l-r;n>0;n--)
                t = '0'+t;
            l=r;
        }
        for(int i=s.size()-1;i>=0;i--){
            tmp = s[i]-'0'+t[i]-'0'+carry;
            if(tmp>=10){
                carry = 1;
                tmp -= 10;
            }else
                carry = 0;
            s[i] = tmp+'0';
        }
        if(carry)
            s = '1'+s;
        return s;
            
        
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 1264KB, 提交时间: 2021-06-03

// class Solution {
// public:
//     /**
//      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
//      * 计算两个数之和
//      * @param s string字符串 表示第一个整数
//      * @param t string字符串 表示第二个整数
//      * @return string字符串
//      */
//     string solve(string s, string t) {
//         // write code here
//         int a =0,b=0;
//         int sum = 0;
//         if(s.size() == 1)
//             a = s[0]-'0';
//         else
//         {
//             for(int i = 0;i<s.size();i++)
//             {
//                 a+=(s[i]-'0')*pow(10, i);
//             }
//         }
//         if(t.size() == 1)
//             b = t[0]-'0';
//         else
//         {
//             for(int i = 0;i<t.size();i++)
//             {
//                 a+=(t[i]-'0')*pow(10, i);
//             }
//         }
//         sum = a+b;
//         stringstream ss;
//         ss<<sum;
//         string summ = ss.str();
//         return summ;
        
//     }
// };

static const auto io_sync_off = []()//lambda函数
{
    // turn off sync,关闭输入输出流的缓存
    std::ios::sync_with_stdio(false);
    // untie in/out streams,实现输入和输出流的解绑
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int l = s.length();
        int r = t.length();
        if(!l) return t;
        if(!r) return s;
        int carry = 0,tmp = 0;
        if(l<r){
            for(int n=r-l;n>0;n--)
                s = '0'+s;
            l=r;
        }else if(l>r){
            for(int n=l-r;n>0;n--)
                t = '0'+t;
            l=r;
        }
        for(int i=s.size()-1;i>=0;i--){
            tmp = s[i]-'0'+t[i]-'0'+carry;
            if(tmp>=10){
                carry = 1;
                tmp -= 10;
            }else
                carry = 0;
            s[i] = tmp+'0';
        }
        if(carry)
            s = '1'+s;
        return s;
             
         
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 1284KB, 提交时间: 2021-02-02

static const auto io_sync_off = []()//lambda函数
{
    // turn off sync,关闭输入输出流的缓存
    std::ios::sync_with_stdio(false);
    // untie in/out streams,实现输入和输出流的解绑
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        if(s.empty())return t;
        if(t.empty())return s;
        if(s.size()<t.size())swap(t, s);
        int tail=s.size()-t.size();
        int carry=0,tmp=0;
        while(tail--) t='0'+t;
        for (int i=s.size()-1;i>=0;i--){
            tmp=s[i]-'0'+t[i]-'0'+carry;
            if(tmp>=10){
                carry=1;
                tmp-=10;
            }
            else{
                carry=0;
            }
            s[i]=tmp+'0';
        }
        if (carry==1){
            s='1'+s;
        }
        return s;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 1484KB, 提交时间: 2021-03-15

static const auto io_sync_off = []()//lambda函数
{
    // turn off sync,关闭输入输出流的缓存
    std::ios::sync_with_stdio(false);
    // untie in/out streams,实现输入和输出流的解绑
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        if (s.empty()) return t;
        if (t.empty()) return s;
        if (s.size() < t.size()) swap(s,t);
        int tail = s.size()-t.size();
        while(tail--) t = '0'+t;
        int carry=0;
        int tmp =0;
        for (int i = s.size()-1; i>=0;i--)
        {
            tmp = s[i]- '0' + t[i] - '0' + carry;
            if (tmp >=10)
            {
                carry = 1;
                tmp -= 10;
            }else{
                carry = 0;
            }
            s[i] = tmp + '0';
        }
        if (carry == 1) {
            s = '1' + s;
        }
        return s;
    }
};

Go 解法, 执行用时: 3ms, 内存消耗: 1620KB, 提交时间: 2021-05-23

package main
 
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
*/
func solve( s string ,  t string ) string {
    // write code here
     
    m := len(s)
    n := len(t)
     
    // let m < n
    if m > n {
        m,n = n,m
        s,t = t,s
    }
     
    ret := make([]byte, n + 1)
     
    carry := 0
    for i:=0; i< n; i++ {
        longN := int(t[n-i-1] - '0')
        shortN := 0
        if m-i-1 >= 0 {
            shortN = int(s[m-i-1] - '0')
        }
         
        result := longN + shortN + carry
        carry = result / 10
        result = result % 10
        ret[n-i] = byte(result + '0')
    }
     
    if carry == 1 {
        ret[0] = '1'
        return string(ret)
    }
     
    return string(ret[1:])
}

上一题