高精度加法
608 字
3 分钟
高精度加法

高精度加法
高精度加法用于处理超过 long long 范围的大整数相加。
C++ 的整数类型有上限,但题目可能给出几百位甚至几千位的数字。这时就不能直接用 int 或 long long,需要用字符串读入,再手动模拟竖式加法。
1、核心思想
比如计算:
123 + 89手算时会从个位开始:
3 + 9 = 12,写 2 进 12 + 8 + 1 = 11,写 1 进 11 + 1 = 2结果是:
212程序里也一样,从低位到高位逐位相加。
2、为什么倒序存储
字符串 "123" 的下标从左到右是高位到低位。
但加法要从个位开始,所以我们把它倒序存入数组:
字符串:1 2 3数组: 3 2 1这样数组下标 0 就是个位,处理进位很方便。
3、模板步骤
1. 字符串读入两个大整数2. 倒序存入 vector3. 从低位到高位逐位相加4. 用 t 保存进位5. 最后倒序输出结果4、C++ 模板
#include <bits/stdc++.h>using namespace std;
vector<int> add(vector<int>& A, vector<int>& B) { vector<int> C;
int t = 0; for (int i = 0; i < (int)A.size() || i < (int)B.size(); i++) { if (i < (int)A.size()) t += A[i]; if (i < (int)B.size()) t += B[i];
C.push_back(t % 10); t /= 10; }
if (t) C.push_back(t);
return C;}
int main() { string a, b; cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
vector<int> C = add(A, B);
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;}5、手推代码里的 t
t 同时承担两个作用:
当前位相加的和 + 上一位进位每次:
C.push_back(t % 10);t /= 10;t % 10 是当前位结果,t / 10 是进位。
6、容易写错的地方
(1)最后的进位不能漏
if (t) C.push_back(t);比如:
999 + 1 = 1000最后会多出一个进位。
(2)字符要减 '0'
A.push_back(a[i] - '0');否则存进去的是字符编码,不是数字。
(3)输出时要倒序
数组低位在前,所以输出时要从后往前:
for (int i = C.size() - 1; i >= 0; i--)总结
高精度加法就是模拟竖式:
倒序存储 -> 逐位相加 -> 处理进位 -> 倒序输出只要把“低位在数组前面”这个约定记住,后面的高精度减法、乘法、除法也会更容易理解。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!














