1.高精度乘法概念
由于计算机的存储字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为高精度算法。这里的高精度乘法主要指按位模拟乘法,实际上就是模拟乘法的过程,也就是笔算的过程。高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。
2.高精度乘法算法的基本流程分析
高精度乘法基本思想和加法一样。其基本流程如下:
①读入被乘数s1,乘数s2
②把s1、s2分成4位一段,转成数值存在数组a,b 中;记下a,b的长度k1,k2;
③i赋为b中的最低位;
④从b中取出第i位与a相乘,累加到另一数组c中;(注意:累加时错开的位数应是多少位?)
⑤i:=i-1;检测i值:小于k2则转⑥,否则转④
⑥打印结果
3.高精度乘法的算法思想:
算法思想:
将数字的每个位与下一个要乘的数字进行相乘,然后进行相应的进位处理。
进位处理的过程:先将其中的某一位与数字相乘,如a[0] = 1, 阶乘循环到n = 2,即t = a[0] * 2+data,然后进行判断t是否大于等于10,如果大于等于10,则进行进位处理,即,将本位置为t % 10,然后进位的数字保存在data中。然后下一位处理的时候,t不仅要是本位与数字的乘积还要加上进位。
4.高精度算法的代码实现
代码如下所示:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 * 3;
char a[N];
int n;
int main() {
cin >> n;
memset(a, 'b', sizeof a);
a[0] = '1';
int k = 1;
for (int i = 2; i<=n; i++) {
int j = 0;
int data = 0;
//遍历数字,与下一个数相乘
while(j < k) {
//计算得出其中一位的乘积 并加上进位
int t = (a[j]-'0') * i + data;
if (t >= 10) { //如果t >= 10说明需要进位,这里就需要我们,使用data进行保留进位
a[j] = t % 10 + '0';
data = t /10;
}
else {
//表示没有进位,data = 0;
a[j] = t % 10 + '0';
data = 0;
}
j++;
}
//如果已经乘积完毕,但是仍然有进位(即这里的data大于0)
while(data > 0) {
a[j++] = data%10 + '0';
data /= 10;
}
k = 0;
//这里是为了找出乘积后的数字一共有几位数
while (a[k++]!='b');
k--;
}
//反序输出字符串数组中的字符即是我们的所求数字
for (int i = k-1; i>=0; i--) cout << a[i];
return 0;
}
C++算法的优雅实现:
这是我见过我简洁的实现方法
Wint operator*(const Wint &a,const Wint &b)
{
Wint n;
n.assign(a.size()+b.size()-1,0);
for(int i=0; i!=a.size(); ++i)
for(int j=0; j!=b.size(); ++j)
n[i+j]+=a[i]*b[j];
return n.check();
}
Wint& operator*=(Wint &a,const Wint &b)
{
return a=a*b;
}
这里有个注意点,就是一定要注意两个方法的实现顺序,不能颠倒。
算法更多的还是对现实的模拟和改进。
如果有帮助,点个关注,相互交流,相互学习,共同进步。