题解
【基础】高精度加法
1 条题解
-
0
解题思路
高精度加法:两个不超过 240 位的数相加,数字太大不能直接用 int,要一位一位处理。
思路:
- 逆序存数组:把两个加数的数字串逆序存进数组,个位放在 a[0]、b[0],方便从低位算起
- 逐位相加:从低位到高位,把 a[i] 和 b[i] 加起来放进 c[i]
- 处理进位:某一位超过 10,就把十位以上的部分进到更高一位
- 逆序输出:如果最高位进位产生了新的一位,位数加 1,然后从高到低输出
为什么逆序存? 因为加法要从个位(低位)开始算,逆序存放后下标 0 就是个位,直接从 0 开始遍历就是低位到高位,方便进位。
举例:333...333 + 222...222 = 555...555
- 个位 3+2=5,十位 3+2=5……每一位都够,不用进位
- 结果每一位都是 5
参考代码
#include <iostream> #include <string> using namespace std; string s1, s2; int a[250], b[250], c[500]; int len; int main() { cin >> s1 >> s2; for (int i = 0; i < s1.size(); i++) a[s1.size() - 1 - i] = s1[i] - '0'; for (int i = 0; i < s2.size(); i++) b[s2.size() - 1 - i] = s2[i] - '0'; len = s1.size(); if (s1.size() < s2.size()) len = s2.size(); for (int i = 0; i < len; i++) c[i] = a[i] + b[i]; // 逐位相加 for (int i = 0; i < len; i++) { // 处理进位 if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] = c[i] % 10; } } if (c[len] != 0) len++; // 最高位进位 for (int i = len - 1; i >= 0; i--) cout << c[i]; // 输出 return 0; }复杂度分析
- 时间复杂度:O(N),N 为位数
- 空间复杂度:O(N),存数字的数组
- 1