本文写一下高精度乘法的代码化思路。
基于高精度加法之上,前面预处理两个字符串以及转化为整型数组存储的过程我就不讲了。这里着力讲一下竖式计算的具体模拟过程
引入:
我们先来回顾一下竖式计算的特点,分位计算,错位相加。
比如 (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 <algorithm>
#