题解 | #大数加法#

大数加法

http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

一、题目描述

NC1大数加法
题目大意:以字符串形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回
注意审题:字符串长度不大于100000,保证字符串仅由'0'~'9'这10种字符组成(说明算法的之间复杂度应该控制在线性,且两个字符串表示的数是非负数)

二、算法(模拟)

解题思路

  1. 本题是经典的高精度加法问题,但是不用考虑负数的情况,所以较为简单。
  2. 我们可以模拟竖式加法进行运算,一开始先将两个字符串翻转,即从低位向高位计算;然后我们模拟竖式加法的原则,将对应数位的值相加,再加上上一步的进位值,假设和为d,则结果的当前位为d % 10,进位值为d / 10,以此类推
  3. 我们可以发现,两个数相加的结果最多为最高数位+1,例如一个2位数和4位数相加,结果最多为5位数,以此当运算到最高数位后,进位值d可能不为0,则需要添加一位d

图片说明

代码实现(C++11)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        if(s.size() < t.size()) return solve(t, s);    // 若s的长度小于t, 交换一下两者的位置
        reverse(s.begin(), s.end());    // 翻转s
        reverse(t.begin(), t.end());    // 翻转t
        string ans;    
        int d = 0;    // 进位值
        for(int i = 0; i < s.size(); i++){    // 以最大的数位基准
            d += s[i] - '0';
            if(i < t.size()) d += t[i] - '0';    // 若t当前位不为0
            ans += d % 10 + '0';    // 当前位的结果
            d /= 10;    // 下一步的进位值
        }
        if(d) ans += d % 10 + '0';    // 若d不为0,增加一位
        reverse(ans.begin(), ans.end());    // 将答案翻转
        return ans;
    }
};

时间复杂度:O(max(n, m)),n为s的长度,m为t的长度
空间复杂度:O(1)

全部评论
感觉也可以不翻转,两个字符串从屁股开始读取😁
点赞 回复 分享
发布于 2022-02-28 15:19
大佬太强啦!代码简洁,思路清晰
点赞 回复 分享
发布于 2022-02-19 17:37

相关推荐

2025-12-26 10:52
河北传媒学院 Java
点赞 评论 收藏
分享
嵌入式的小白:面试少的,说明你的投递的岗位和简历匹配度不高,技术这个东西很杂的,你这种情况,建议 1.看看嵌入式招聘的岗位需求,会有不同大方向的,比如MCU,RTOS的,或者linux上驱动的,或者应用层的,这都是简单分类,但对技术要求差异很大的 2.结合你的经验,看能和哪类匹配上,就找对应类别的 3.简历和招聘岗位需求对着看下,看人家需要啥,你会啥,匹配度高才有会高概率有面试的
秋招的第一个offer,...
点赞 评论 收藏
分享
评论
14
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务