➕
高精度加法
数组就是竖式草稿纸:下标 0 存个位,像小学一样列竖式加
💡 打个比方
int 是个只有 32 格的小盒子,装不下 20 亿以上的大数。怎么办?列竖式!用数组当草稿纸,每个格子存 1 个十进制数字,从个位开始一位一位加,满十就进位——和小学完全一样。
关键约定:下标 0 存个位(倒着存)。这样两个数的个位都在下标 0,加的时候下标天然对齐——就像竖式要求"个位对个位"!
高精度加法:把大数当字符串读入,倒着存进数组(a[0]=个位),逐位相加 s = a[i] + b[i] + 进位,写下 s%10、进位 s/10;最后进位补一位。
🖼️ 大图看明白
📏 高精度加法,只要 3 步
- 第 1 步:字符串读入,倒着存进数组:a[0]=个位、a[1]=十位……(个位对齐个位)。
- 第 2 步:从 i=0 逐列加:s = a[i] + b[i] + carry,写下 c[i] = s % 10,carry = s / 10。
- 第 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;最后有进位就顶上补一位。