#M8402. 高精度算法_乘法与除法

高精度算法_乘法与除法

高精度乘法


利用数组模拟手工乘法过程, 从低位到高位逐位相乘,将乘积加到对应位置上,并处理进位,得到最终结果。

高精度 × 单精度

乘数中的一个数是普通的 int 类型。

一个直观的思路是直接将 a 每一位上的数字乘以 b。从数值上来说,这个方法是正确的,但它并不符合十进制表示法,因此需要将它重新整理成正常的样子。

重整的方式,也是从个位开始逐位向上处理进位。但是这里的进位可能非常大,甚至远大于 9,因为每一位被乘上之后都可能达到 9b 的数量级。所以这里的进位不能再简单地进行 -10 运算,而是要通过除以 10 的商以及余数计算。

图展示的一个计算高精度数 9980 乘以单精度数 10 的过程。

高精度 × 单精度_参考代码

高精度 × 单精度_代码解析

定义存储数组:根据题目要求定义数组,用于存储大整数和结果。 首先读入一个大整数和小整数,并将大整数转换为数组存储。然后从低位到高位逐位与小整数相乘,并将乘积加到结果数组的对应位置上。再处理进位。最后从高位到低位依次输出结果。注意,如果最高位有进位,则需要将结果的长度加1。


高精度 × 高精度

两个乘数都是高精度

那么竖式乘法又可以大显身手了,回想竖式乘法的每一步,实际上是计算了若干 a×bi×10ia × b_i × 10^i 的和。例如计算 1337 × 42,计算的就是 1337×2×100+1337×4×1011337 × 2 × 10^0 + 1337 × 4 × 10^1

于是可以将 b 分解为它的所有数码,其中每个数码都是单精度数,将它们分别与 a 相乘,再向左移动到各自的位置上相加即得答案。当然,最后也需要用与上例相同的方式处理进位。

图展示的一个计算高精度数 1234 乘以高精度数 12 的过程。

高精度 × 高精度_参考代码

高精度 × 高精度_代码解析

定义存储数组:根据题目要求定义数组,用于存储两个大整数和结果。 首先读入两个大整数,并将两个大整数转换为数组存储。确定结果数组的长度,通常是被乘数和乘数位数之和减一。然后从低位到高位遍历被乘数和乘数逐位相乘并将乘积加到结果数组的对应位置上,再处理进位。最后从高位到低位依次输出结果。注意,如果最高位有进位,则需要将结果的长度加1。


高精度除法


利用数组模拟手工除法过程,逐位试商法,从被除数的第一位开始,用此数除以除数,得出商和余数,用得出的余数与被除数的下一位数字结合继续除以除数,以此类推,直到得到最终结果。

图展示的一个计算高精度数 4516 除单精度数 23 的过程。

高精度 ÷ 单精度_参考代码

高精度 ÷ 单精度_代码解析

定义存储数组:根据题目要求定义数组,用于存储被除数和结果(商)。 首先读入一个大整数和小整数,并将大整数转换为数组存储。然后从被除数的最高位开始,依次取出一位数字进行除法运算,将当前位de 商添加到结果中,并处理余数(作为下一轮运算的被除数)。在得到最终结果后,需要删除前导零并输出商和余数(如果需要)。