大数计算📝
大数加法(High Precision Addition)总结
在算法竞赛中,经常会遇到一种情况:
数字大到
long long都装不下。
例如:
这时候就不能直接用 int、long long 计算了,需要使用 大数加法。
简单理解:
把数字当字符串处理,模拟我们平时列竖式加法。
1. 什么是大数加法
普通整数类型范围有限:
如果数字超过这个范围,就会溢出。
例如:
这时只能:
- 用字符串存储数字
- 一位一位相加
- 手动处理进位
这就是大数加法。
2. 核心思想(小学竖式加法)
例如:
计算过程:
所以结果:
这就是程序实现思路。
3. 实现步骤
设两个字符串:
步骤:
- 从末尾开始加
因为个位在最后:
所以从后往前遍历。
- 每位求和
其中:
-
carry= 进位(0 或 1) -
当前位存结果
- 更新进位
- 最后翻转答案
因为是从低位往高位算的。
4. 标准 C++ 模板
#include <iostream>
#include <algorithm>
using namespace std;
string add(string a, string b)
{
string ans = "";
int i = a.size() - 1;
int j = b.size() - 1;
int carry = 0;
while(i >= 0 || j >= 0 || carry)
{
int sum = carry;
if(i >= 0) sum += a[i--] - '0';
if(j >= 0) sum += b[j--] - '0';
ans += char(sum % 10 + '0');
carry = sum / 10;
}
reverse(ans.begin(), ans.end());
return ans;
}
int main()
{
string a, b;
cin >> a >> b;
cout << add(a, b);
}
5. 举例演示
输入:
过程:
输出:
6. 为什么要反转
程序计算顺序:
加入答案时:
实际上字符串变成:
所以最后要翻转:
7. 竞赛中的常见题型
- 两个超长整数相加
直接模板题。
- 求斐波那契数列第 1000 项
普通类型爆炸,要用大数加法:
- 高精度阶乘
也会用到加法 / 乘法。
8. 常见错误
- 字符忘记转数字
错误:
正确:
- 忘记处理最后进位
例如:
最后还有进位。
- 忘记 reverse
结果会倒着输出。
9. 万能记忆口诀
10. 常考程度
经常和这些结合:
- 递推
- DP
- 阶乘
- 组合数
- 斐波那契
- 卡精度题
11. 推荐练习题
12. 一句话理解
大数加法 = 用字符串模拟小学列竖式加法。
13. 如果你是算法比赛选手,建议进一步掌握
下一步学习顺序:
最实战写法(比赛速写版)