跳转至

大数计算📝

Tip

其实java或者python里面有对应的类库,都不需要考虑这个问题
这个也不作为本次考试重点,了解为主
b站讲解
知乎文章

大数加法(High Precision Addition)总结

在算法竞赛中,经常会遇到一种情况:

数字大到 long long 都装不下。

例如:

999999999999999999999999999999
+
888888888888888888888888888888

这时候就不能直接用 intlong long 计算了,需要使用 大数加法

简单理解:

把数字当字符串处理,模拟我们平时列竖式加法。


1. 什么是大数加法

普通整数类型范围有限:

int        大约 21 亿
long long  大约 9e18

如果数字超过这个范围,就会溢出。

例如:

123456789123456789123456789

这时只能:

  • 用字符串存储数字
  • 一位一位相加
  • 手动处理进位

这就是大数加法。

2. 核心思想(小学竖式加法)

例如:

   9876
+  567
------
 10443

计算过程:

6 + 7 = 13,写3进1
7 + 6 + 1 = 14,写4进1
8 + 5 + 1 = 14,写4进1
9 + 0 + 1 = 10,写0进1
最后补1

所以结果:

10443

这就是程序实现思路。

3. 实现步骤

设两个字符串:

a = "9876"
b = "567"

步骤:

  1. 从末尾开始加

因为个位在最后:

a[3] = 6
b[2] = 7

所以从后往前遍历。

  1. 每位求和
sum = 当前位a + 当前位b + carry

其中:

  • carry = 进位(0 或 1)

  • 当前位存结果

sum % 10
  1. 更新进位
carry = sum / 10
  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. 举例演示

输入:

999
1

过程:

9+1=10 写0进1
9+0+1=10 写0进1
9+0+1=10 写0进1
最后补1

输出:

1000

6. 为什么要反转

程序计算顺序:

个位 → 十位 → 百位

加入答案时:

0
00
000
0001

实际上字符串变成:

0001

所以最后要翻转:

1000

7. 竞赛中的常见题型

  1. 两个超长整数相加

直接模板题。

  1. 求斐波那契数列第 1000 项

普通类型爆炸,要用大数加法:

f[n] = f[n-1] + f[n-2]
  1. 高精度阶乘
100!
200!
500!

也会用到加法 / 乘法。

8. 常见错误

  1. 字符忘记转数字

错误:

sum += a[i];

正确:

sum += a[i] - '0';
  1. 忘记处理最后进位

例如:

999 + 1

最后还有进位。

  1. 忘记 reverse

结果会倒着输出。


9. 万能记忆口诀

末尾开始逐位加
进位 carry 别落下
结果倒着先存入
最后 reverse 就拿下

10. 常考程度

经常和这些结合:

  • 递推
  • DP
  • 阶乘
  • 组合数
  • 斐波那契
  • 卡精度题

11. 推荐练习题

1. A + B Problem(超长版)
2. 求 1000!
3. Fibonacci 大数输出
4. 杨辉三角高精度

12. 一句话理解

大数加法 = 用字符串模拟小学列竖式加法。


13. 如果你是算法比赛选手,建议进一步掌握

下一步学习顺序:

大数加法
→ 大数减法
→ 大数乘法
→ 大数除法
→ 高精度模板合集

最实战写法(比赛速写版)

string add(string a,string b)
{
    string c="";
    int i=a.size()-1,j=b.size()-1,t=0;

    while(i>=0||j>=0||t)
    {
        if(i>=0) t+=a[i--]-'0';
        if(j>=0) t+=b[j--]-'0';

        c+=t%10+'0';
        t/=10;
    }

    reverse(c.begin(),c.end());
    return c;
}