➕

高精度加法

数组就是竖式草稿纸:下标 0 存个位,像小学一样列竖式加

💡 打个比方

int 是个只有 32 格的小盒子,装不下 20 亿以上的大数。怎么办?列竖式!用数组当草稿纸,每个格子存 1 个十进制数字,从个位开始一位一位加,满十就进位——和小学完全一样。

关键约定:下标 0 存个位(倒着存)。这样两个数的个位都在下标 0,加的时候下标天然对齐——就像竖式要求"个位对个位"!

高精度加法:把大数当字符串读入,倒着存进数组(a[0]=个位),逐位相加 s = a[i] + b[i] + 进位,写下 s%10、进位 s/10;最后进位补一位。

🖼️ 大图看明白

竖式:9999999 + 1,进位像滚雪球一样一路传上去 9 9 9 9 9 9 9 + 1 9+1=10 进 1 每一列都 9+1=10,进位不停传! 1 0 0 0 0 0 0 0 最后进位,顶上补 1 数组视角:下标 0 = 个位(倒着存,下标天然对齐) a: 9 9 9 9 9 9 9 0123 456 b: 1 0 c: 0 0 0 0 0 0 0 1 0123 4567 新增的最高位 第 1 列:9 + 1 = 10 写下 0,进位 1 → 第 2 列:9 + 进位 1 = 10 写下 0,进位 1 → …… 7 个 9,进位滚雪球 每列都是"写 0、进 1" 最后进位 1 没人接了 顶上补 c[7] = 1 → 10000000

📏 高精度加法,只要 3 步

  1. 第 1 步:字符串读入,倒着存进数组:a[0]=个位、a[1]=十位……(个位对齐个位)。
  2. 第 2 步:从 i=0 逐列加:s = a[i] + b[i] + carry,写下 c[i] = s % 10,carry = s / 10。
  3. 第 3 步:加完还有进位?顶上补一位(结果比加数多 1 位)。从高位往低位输出。
为什么下标 0 存个位?竖式加法从个位开始加,个位都在 a[0]、b[0],下标天然对齐,一个 for 循环就搞定。数组大小记得开大一点(多留 1 位给进位)。

💻 C++ 怎么写

#include <iostream>
#include <string>
using namespace std;

int main() {
    string sa, sb;
    cin >> sa >> sb;
    int a[1005] = {}, b[1005] = {}, c[1005] = {};
    int la = sa.length(), lb = sb.length();
    for (int i = 0; i < la; i++)
        a[i] = sa[la - 1 - i] - '0';   // 倒着存:下标 0 = 个位
    for (int i = 0; i < lb; i++)
        b[i] = sb[lb - 1 - i] - '0';
    int carry = 0, len = max(la, lb);
    for (int i = 0; i < len; i++) {
        int s = a[i] + b[i] + carry;
        c[i] = s % 10;    // 写下个位
        carry = s / 10;   // 进位
    }
    int top = len - 1;
    if (carry) { c[len] = carry; top = len; }  // 顶上补一位
    for (int i = top; i >= 0; i--)
        cout << c[i];      // 从高位到低位输出
    cout << "\n";
    return 0;
}

✋ 你来试试

题目 1:为什么要把个位存在下标 0,而不是最高位?
因为竖式加法从个位开始加,个位必须对个位。个位都放在下标 0,两个数组的下标就天然对齐,直接 a[i]+b[i] 就行。如果存最高位,两个数长度不同,末尾(个位)对不齐,还得算偏移量,麻烦多了。
题目 2:用数组思路算 999 + 1,进位滚了几次?结果几位?
999 + 1:个位 9+1=10 写 0 进 1;十位 9+1=10 写 0 进 1;百位 9+1=10 写 0 进 1——滚了 3 次。最后进位顶上补 1,结果是 1000,4 位(比 999 多 1 位)。所以数组要开得比数字位数多 1。
🎯 一句话记住:数组是竖式草稿纸,下标 0 存个位;逐位加:写 s%10、进 s/10;最后有进位就顶上补一位。