高精度加法

608 字
3 分钟
高精度加法

高精度加法#

高精度加法用于处理超过 long long 范围的大整数相加。

C++ 的整数类型有上限,但题目可能给出几百位甚至几千位的数字。这时就不能直接用 int 或 long long,需要用字符串读入,再手动模拟竖式加法。

1、核心思想#

比如计算:

123 + 89

手算时会从个位开始:

3 + 9 = 12,写 2 进 1
2 + 8 + 1 = 11,写 1 进 1
1 + 1 = 2

结果是:

212

程序里也一样,从低位到高位逐位相加。

2、为什么倒序存储#

字符串 "123" 的下标从左到右是高位到低位。

但加法要从个位开始,所以我们把它倒序存入数组:

字符串:1 2 3
数组: 3 2 1

这样数组下标 0 就是个位,处理进位很方便。

3、模板步骤#

1. 字符串读入两个大整数
2. 倒序存入 vector
3. 从低位到高位逐位相加
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--)

总结#

高精度加法就是模拟竖式:

倒序存储 -> 逐位相加 -> 处理进位 -> 倒序输出

只要把“低位在数组前面”这个约定记住,后面的高精度减法、乘法、除法也会更容易理解。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

高精度加法
https://blog.tjcheng.cn/posts/migrated/old-84/
作者
TengJinCheng
发布于
2025-10-08
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
TengJinCheng
Hello, I'm Teng.
公告
欢迎来到TengJinCheng工作铺!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
157
分类
7
标签
114
总字数
109,939
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.4
文章许可
CC BY-NC-SA 4.0

文章目录