CST2016 1-1 BigInt
描述
邓俊辉老师的作业常常过于简单,数据类型只需使用int。助教们一致认为,向同学们介绍Python中自带的长整型是十分有必要的。例如,它可以计算几百位的整数乘法。 但是,在介绍长整型之前,助教决定让你自己实现一遍长整型乘法,以加深对它的理解。
解题思路
在题目页面,已经提示了我们大整数加法的算法,题目只需要推广到大整数乘法。
首先来说,我们需要处理的是数据的储存:
A = 27376737, B = 8722230
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| A | 7 | 3 | 7 | 6 | 7 | 3 | 7 | 2 |
| B | 0 | 3 | 2 | 2 | 2 | 7 | 8 | 0 |
注意:数字的储存顺序是反的,A的个位储存在A[0]中,A的十位储存在A[1]中,以此类推。
然后我们就可以来做乘法了。
如果忽略进位,那么高精度乘法其实卷积。
C的个位 = A的个位 * B的个位
C的十位 = A的十位 B的个位 + A的个位 B的十位
。。。
表示成数学表达式:
计算完卷积之后,再完成进位,就实现了高精度乘法。
注意:由于题目数据组数较多,这里介绍的最基本的算法还不够用,需要进一步位压。
具体来说,这里介绍的算法A[0]储存的是A的最低位,如果位压4位,那么A[0]储存A的低4位。
不过,位压4位还不够2333333,我是用long long来储存每一位,位压8位过的。
同时,为了提速,需要把求余运算提出到卷积运算之后。