当前位置: 首页 > news >正文

C++ 大数相加(简要版)

#include <algorithm>
#include <iterator>
class Solution {
public:
    /**
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) 
    {
        // 处理空字符串的情况,如果 t 为空,则直接返回 s
        if(t.size() == 0)
        {
            return s;
        }
        // 如果 s 为空,则直接返回 t
        if(s.size() == 0)
        {
            return t;
        }

        // 将两个字符串反转,方便从低位到高位相加
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());

        // 确保 s 的长度不小于 t 的长度,方便处理进位
        if(s.size() < t.size())
        {
            swap(s, t);
        }

        // 将 t 的长度扩展到与 s 相同,缺失的位补充为 0
        while(t.size() < s.size())
        {
            t += '0';
        }

        // 获取 s 的长度,用于遍历
        int size = s.size();

        // 用于存储最终结果
        string ret;

        // 记录进位
        int cnt = 0;

        // 遍历每一位进行加法计算
        for(int i = 0; i < size; i++)
        {
            // 计算当前位置的和,并加上上一次的进位
            // 通过 s[i] 和 t[i] 的字符转换为整数进行加法
            // '0' 是为了将字符转为数字,字符 '0' 对应整数值 0
            // 计算的 tmp 是字符加法结果(可能带进位)
            char tmp = s[i] + t[i] - '0' + cnt;

            // 如果和大于 '9',则需要产生进位
            if(tmp > '9')
            {
                tmp -= 10;  // 将超过 9 的部分扣除,保留个位
                cnt = 1;    // 设置进位为 1
            }
            else 
            {
                cnt = 0;    // 不需要进位,cnt 设置为 0
            }

            // 将当前计算的字符加入到结果字符串中
            ret += tmp;
        }

        // 如果遍历完所有位后仍有进位,则需要在结果末尾添加 1
        if(cnt == 1)
        {
            ret += '1';
        }

        // 最后将结果字符串反转,得到正确的顺序
        reverse(ret.begin(), ret.end());

        // 返回最终计算的和
        return ret;
    }
};

详细中文注释解释:

  1. 空字符串处理

    • 如果 t 为空,直接返回 s。如果 s 为空,直接返回 t。这是为了避免对空字符串进行无意义的加法。

  2. 字符串反转

    • 由于加法是从低位到高位进行的,因此我们首先将两个字符串反转,方便从低位开始相加。

  3. 调整字符串长度

    • 如果 st 短,则交换它们的位置,保证 s 总是较长的字符串。

    • 然后将 t 的长度扩展到与 s 相同,缺少的位补充为 0。这样做的目的是确保两个字符串的长度一致,方便逐位加法。

  4. 逐位加法

    • 通过一个循环,逐位计算两个字符串的和。每次加法会计算当前位的和,同时考虑上一个计算中的进位(cnt)。

    • 如果当前位的和大于 9,则产生进位。否则,不产生进位。

  5. 处理进位

    • 如果计算完所有位后仍然有进位(cnt == 1),则在结果字符串末尾加上 1

  6. 反转结果

    • 最后,反转 ret 字符串,得到正确的加法结果。

举个例子:

假设 s = "123"t = "987",我们将按以下步骤处理:

  1. 反转 st,得到 "321""789"

  2. 执行逐位加法:3 + 7 = 10,进位为 1;2 + 8 + 1 = 11,进位为 1;1 + 9 + 1 = 11,进位为 1。

  3. 结果是 "1110",然后再加上进位,得到最终的结果 "1110"

时间复杂度:

  • 时间复杂度是 O(n),其中 n 是两个字符串中较长字符串的长度。我们需要逐位遍历并进行加法操作。

相关文章:

  • 整体 Vue 系统框架下的优化方案,旨在减少内存用量并提升整体性能
  • 【时时三省】(C语言基础)用switch语句实现多分支选择结构 例题
  • MATLAB编写的机械臂控制仿真程序,它主要实现了对一个二连杆机械臂的运动控制仿真,比较了PID控制和非线性模型预测控制两种方法在机械臂轨迹跟踪任务中的性能
  • 【发布】dtns协议的js-sdk(实现a2a协议:agent2agent)
  • 本地搭建直播录屏应用并实现使用浏览器远程控制直播间录屏详细教程
  • 量子测试时代,会来得比我们想象中更快?
  • 02-MySQL 面试题-mk
  • KDD 2025 顶会最新力作,多变量时间序列预测登顶!
  • truncate,drop,delete分析
  • 制造企业如何通过实现数据统一?
  • MCU如何查看系统有没有卡死
  • 解决vcpkg使用VS2022报错问题
  • 【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为
  • Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification
  • NO.90十六届蓝桥杯备战|动态规划-区间DP|回文字串|Treats for the Cows|石子合并|248(C++)
  • Prometheus实现负载均衡并将多个实例数据汇总到一个主Prometheus
  • 【JavaScript】错误处理与调试
  • 【antd + vue】Modal 对话框:修改弹窗标题样式、Modal.confirm自定义使用
  • 【愚公系列】《高效使用DeepSeek》066-纠纷解决话术
  • uniapp解决上架华为应用市场审核要求-监听权限的申请
  • 胶州专业网站建设公司/苏州seo培训
  • 300m空间够用吗 wordpress/百度竞价优化软件
  • 做网站需要学php吗/网站seo
  • 传媒公司网站设计方案/比较正规的代运营
  • 财经大学网站建设/seo自然优化排名技巧
  • 深圳餐饮网站建设/排名优化公司哪家靠谱