【浅谈高精度乘法】

本文写一下高精度乘法的代码化思路。

基于高精度加法之上,前面预处理两个字符串以及转化为整型数组存储的过程我就不讲了。这里着力讲一下竖式计算的具体模拟过程

引入:
我们先来回顾一下竖式计算的特点,分位计算,错位相加
比如 (0用来补齐)
0 5 4 3 2
x 0 6 7 8
先是8乘上5432得到一行,再将位置移动到7, 7 x 5432,以此类推。注意到每移动一次下面那个数用来作乘积的位,其结果也要和上一行错开一位,如果用i来控制下面的乘数每个位,j用来控制上面被乘数的每一个位,那么每移动 i 位,乘积结果就会向左错位(移动)i-1 位。

而 j 的移动相当于什么?他相当于是在我当前列式移动了i-1位后,再向前计算 j 位。所以对应到最后计算到的结果时,从后往前计数的话,就是 a[i] * b[j] 对应的是 c[i-1+j] 。
举个例子就很好理解了。
013
x21
————
0013
026
——
0273
a[1] * b[1] = c[1] = 3
a[1] * b[2] + a[2]* b[1] = c[2] = 7

即是 c[ i+j-1 ]+= (a[i]*b[j] + 进位)。

在这里插入图片描述
到了这一步,其实就好办了,因为我们已经知道输出结果的每一位怎么得到了,只需要循环遍历i,j即可。同时记录进位,这就是高精度加法的模板了。
详情见代码

#include <iostream>
#include <vector>
#include <cstdio>
#include <map>
#include <climits>
#include <string>
#include <cmath>
#include <cstring>
#include <stack>
#include <queue>
#include 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值