高精度加法

10 分钟

两个大数倒着存好后,逐位相加。设进位变量 carry,第 位的和等于 a[i]+b[i]+carry;这个和对 10 取余是本位数字,除以 10 是进到下一位的进位。

int c[1005], carry = 0;
int len = max(lenA, lenB);
for (int i = 0; i < len; i++) {
    int s = a[i] + b[i] + carry;  // 短的那个高位补 0
    c[i] = s % 10;                // 本位
    carry = s / 10;               // 进位
}
if (carry) c[len++] = carry;      // 最高位还有进位就加一位

循环不变量:处理完第 位后 carry ,且低 位已完全正确。因为单个数字最大 9,,进位不会超过 1。

复杂度 是较长数的位数。坑:(1)短数高位当作 0,两数组都要开够并清零;(2)循环结束别忘检查 carry 就是靠这一步补出第 4 位;(3)结果长度可能比两个加数都长 1。

小纸条

用竖式算 999+1,进位发生了几次?

登录 后可看答案

高精度加法 · 考级冲刺 · op599 课程