这道题的核心难点是输入的数字超过了 C++ 所有基本数据类型(int、long long)的存储范围(最多 10000 位),普通的加法运算会直接溢出,所以必须用字符串模拟手工加法的方式来解决。
一、题目分析
1. 输入:两个超长整数(最多 10000 位),以字符串形式输入;
2. 输出:两个数的和;
3. 核心思路:模拟我们手工列竖式加法的过程:低位对齐 → 逐位相加 → 处理进位 → 逆序输出结果。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、解题步骤(核心逻辑)
我们做加法的手工步骤:
1. 把两个数个位对齐(代码里用逆序存储实现);
2. 从个位开始,逐位相加,满 10 进 1;
3. 最后处理最高位的进位;
4. 去掉前导 0,逆序输出结果。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、完整代码逐行详解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、关键知识点讲解
1. 为什么要用字符串存储?
* int 最多存 10位 数字,long long 最多存 19位;
* 题目要求最多 10000位,基本数据类型完全存不下,只能用字符串逐位存储。
2. 为什么要逆序存储?
手工加法是从右往左(低位到高位) 计算:
字符串里 1234 是正序:[1,2,3,4],低位在最后;
逆序后变成:[4,3,2,1],低位在最前,循环遍历就能直接从个位开始计算,非常方便。
3. 字符转数字的原理
字符 '5' 和数字 5 不是一个东西:
* 字符 '0' 的 ASCII 码是 48,'1' 是49……'9是57;
* 所以 字符 - '0' 就能得到对应的数字:'5' - '0' = 5。
4. 进位处理逻辑
* 每一位相加结果 ≥10 时,除以10得到进位值,加到下一位;
* 对10取余,保留当前位的数字;
* 最后检查最高位是否有进位,有就把长度+1。
5. 去掉前导0
比如计算 0001 + 0002 = 0003,我们需要输出 3 而不是 0003:
* 循环判断:如果长度>1 且最高位是0,就把长度减1;
* 保证结果至少有一个数字(不会把 0 删掉)。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
五、简化版代码(无多余函数,更易理解)
你原始代码里的 cmp 函数是减法用的,加法完全不需要,这是最简版:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
六、输入输出样例演示
输入:
执行过程:
1. 逆序存储:res[0]=2,res[0] +=1 → res[0]=3;
2. 无进位;
3. 逆序输出:3。
输出:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总结
1. 超大数运算核心:用字符串存储,数组模拟计算;
2. 加法固定模板:逆序存储 → 逐位相加 → 处理进位 → 逆序输出;
3. 本题不需要比较大小,直接相加即可,这是和大数减法的核心区别。