高精度乘法
约 10 分钟
竖式乘法:a 的第 位乘 b 的第 位,得数落在结果的第 位上(个位下标是 0,位权相乘就是下标相加)。先把所有乘积累加到对应位置,最后再统一处理进位。
long long c[2005] = {0};
for (int i = 0; i < lenA; i++)
for (int j = 0; j < lenB; j++)
c[i + j] += a[i] * b[j]; // 先只累加,不进位
int len = lenA + lenB;
for (int i = 0; i < len; i++) { // 最后统一进位
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
while (len > 1 && c[len - 1] == 0) len--;
复杂度 ,两数各 位,结果最多 位。
考试常见坑:(1)c 数组要清零、且开到 ;(2)累加阶段某位的值可能远超 9(很多乘积叠在一起),所以进位必须用 /10 和 %10,不能简单减 10;(3)中间累加值较大,c 用 long long 更稳;(4)任一乘数是 0 时结果是 0,去零要保留一位。
小纸条
a 的第 i 位乘 b 的第 j 位,结果该加到第几位?
登录 后可看答案