乘法
高精度—单精度
高精度乘法,也就是竖……等会儿等会儿!
先考虑一个简单的情况:乘数中的一个是普通的 int
类型。有没有简单的处理方法呢?
一个直观的思路是直接将a 每一位上的数字乘以b 。从数值上来说,这个方法是正确的,但它并不符合十进制表示法,因此需要将它重新整理成正常的样子。
重整的方式,也是从个位开始逐位向上处理进位。但是这里的进位可能非常大,甚至远大于9 ,因为每一位被乘上之后都可能达到 的数量级。所以这里的进位不能再简单地进行-10 运算,而是要通过除以10 的商以及余数计算。详见代码注释,也可以参考下图展示的一个计算高精度数1337 乘以单精度数 42的过程。
当然,也是出于这个原因,这个方法需要特别关注乘数 b的范围。若它和 10^9
(或相应整型的取值上界)属于同一数量级,那么需要慎用高精度—单精度乘法。
void mul_short(int a[], int b, int c[]) {
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
// 直接把 a 的第 i 位数码乘以乘数,加入结果
c[i] += a[i] * b;
if (c[i] >= 10) {
// 处理进位
// c[i] / 10 即除法的商数成为进位的增量值