高精度加法
约 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,进位发生了几次?
登录 后可看答案