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的十位

。。。

表示成数学表达式:

Ck=i=0n1AiBki C_k = \sum_{i=0}^{n-1} A_i * B_{k-i}

计算完卷积之后,再完成进位,就实现了高精度乘法。

注意:由于题目数据组数较多,这里介绍的最基本的算法还不够用,需要进一步位压。

具体来说,这里介绍的算法A[0]储存的是A的最低位,如果位压4位,那么A[0]储存A的低4位。

不过,位压4位还不够2333333,我是用long long来储存每一位,位压8位过的。

同时,为了提速,需要把求余运算提出到卷积运算之后。

results matching ""

    No results matching ""