概述
高精度运算处理超出内置整数类型范围的大数计算,通过模拟手算实现。核心挑战在于平衡效率与代码复杂度,形成从教学到竞赛再到工业应用的渐进式技术路线。
String 正序存储(教学向)
存储结构:字符串顺序存储,下标 0 对应最高位 运用场景:
- 算法入门教学
- 简单脚本工具
- 输入输出密集的轻量级应用
时间复杂度(n 为数字位数):
- 加减法:O(n),需反转或从末尾遍历
- 朴素乘法:O(n²)
- 朴素除法:O(n²)
空间复杂度:O(n),每个字符存储一位十进制数,空间利用率仅 log₁₀(256)≈40%
关键特性:
- 输入输出直观,无需转换
- 运算时需频繁处理反转逻辑
- 难以实现压位优化
一、加法运算
算法讲解/核心思想
本质:完全模拟人类列竖式计算的过程,将数字视为字符串,高位在左(下标 0)。 核心矛盾:人类计算从低位开始,但字符串存储是高位在前,因此运算时需要'对齐个位',这通常通过反转字符串或从末尾遍历来实现。 比喻:就像两个队伍从头(高位)到尾(低位)排列,但计算时需要让尾巴(个位)先碰头,处理起来需要额外步骤。
详细步骤(以加法 123 + 89 为例)
步骤 1: 原始存储 (高位在左) a = "123" (百位 1, 十位 2, 个位 3) b = "89" (十位 8, 个位 9)
步骤 2: 反转对齐个位(关键操作)a_rev = "321" (下标 0 为个位) b_rev = "98" (下标 0 为个位)
步骤 3: 逐位相加,处理进位 (从下标 0 开始)
位 0: 3 + 9 = 12 → 写 2,进位 1
位 1: 2 + 8 + 1(进位) = 11 → 写 1,进位 1
位 2: 1 + 0 + 1(进位) = 2 → 写 2,进位 0
位 3: (无) → 结束
结果(反转后):"212"
步骤 4: 反转回高位在前
最终结果:"212"
代码模板
朴素版本(清晰展示反转逻辑)
#include <algorithm>
#include
std;
{
(a.(), a.());
(b.(), b.());
string result;
carry = ;
( i = ; i < a.() || i < b.(); ++i) {
digit_sum = carry;
(i < a.()) digit_sum += a[i] - ;
(i < b.()) digit_sum += b[i] - ;
result.(digit_sum % + );
carry = digit_sum / ;
}
(carry) result.(carry + );
(result.(), result.());
result;
}


