大数相乘“高精度乘低精度”和“高精度乘高精度”
前言
由于计算机的存储字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为高精度算法。这里的高精度乘法主要指按位模拟乘法,实际上就是模拟乘法的过程,也就是笔算的过程。
一、高精度乘低精度
高精度乘低精度,即一个大数与一个小于10000的数相乘,大数使用字符串来进行存储,较小的数使用int类型来存储就可以。
代码如下:
#include<bits/stdc++.h>
using namespace std;
//C = A * b;A是大数,b使用int类型存储
vector<int> mul(vector<int> &A,int b)
{
vector<int> C;//声明一个动态数组,用于储存结果
int t=0;//进位的值,初始值是0,即最开始的进位是0
for(int i = 0;i < A.size() || t;i++)
//在这里循环进行下去的条件是,i还没有循环结束或者进位值t不等于0
{
if(i<A.size()) t += A[i]*b; //计算出,A的其中1位和b的乘积
C.push_back(t%10);//余数就是其中一位的值
t /= 10; //这个就是需要进到下一位的值
}
while(C.size()>1&&C.back()==0) C.pop_back();//去除前导0
return C;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> A;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
//将a存储在int类型的动态数组中,并且翻转,方便后续计算。
vector<int> C = mul(A,b);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
return 0;
}
二、高精度乘高精度
在这里进位的思想和上一个是一样的,其中需要注意有两点,如下:
首先,两个数相乘,这两个结果的最大的位数,是这两个数的位数相加。
其次,我们需要找到结果的每一位与两个相乘的数的对应关系。
C[i + j] += A[i] * B[j];
这一行代码,就是结果和两个相乘的数的对应的关系,先一位位的乘得到结果,最后再来统一处理进位。
代码如下;
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &A,vector<int> &B)
{
vector<int> C(A.size() + B.size());
for(int i=0;i<A.size();i++)
{
for(int j=0;j<B.size();j++)
{
C[i + j] += A[i] * B[j];
}
}
int t=0;
for(int i=0;i<C.size();i++)
{
t+=C[i];
C[i]=t%10;
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B;
for (int i = a.size() - 1;i >= 0;i--) A.push_back(a[i]-'0');
for (int i = b.size() - 1;i >= 0;i--) B.push_back(b[i]-'0');
vector<int> C = mul(A,B);
for (int i = C.size() - 1;i >= 0;i--) cout<<C[i];
return 0;
}