高精度乘法,实质和加减法一样,为模拟乘法竖式运算。
这里先讲一下竖式计算的方法和原理:
设相乘的两个数A=anan-1...a1a0,B=bmbm-1...b1b0(ai,bi分别表示A和B数位上的每一位数字),则A*B=(an*10n+an-1*10n-1+...+a1*101+a0*100)*(bm*10m+bn-1*10m-1+...+b1*101+b0*100)。
上式利用多项式乘法展开后我们发现:ai*10i*bj*10j=ai*bj*10i+j。
于是我们有了这样的做法:将A和B的每位数字拆分后存入a,b数组,a[i]*b[j]的结果存入c[i+j],再处理进位即可。
#include<bits/stdc++.h>
using namespace std;
int a[505],b[505],c[1010];
int lena,lenb,lenc;
string a1,b1;
int main(){
cin>>a1>>b1;
lena = a1.size()-1;
lenb = b1.size()-1;
for (int i = 0; i <= lena; i++){
a[lena - i - 1] = a1[i] -'0';
}
for(int i = 0; i <= lenb; i++){
b[lenb - i - 1] = b1[i] - '0';
}
for(int i=0;i<=lena;i++)
for(int j=0;j<=lenb;j++)
c[i+j]+=a[i]*b[j]; //结果直接累加在c数组中,相当于同时做了竖式中乘和加的过程。
lenc=lena+lenb; //a[i]*b[j]的最高位相乘是a[lena]*b[lenb],结果在c[lena+lenb]中。
for(int i=0;i<=lenc;i++) //进位处理
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
//最高位进位,最高位位置+1
if(c[lenc+1]) lenc++;
//输出
for(int i=lenc;i>=0;i--) cout<<c[i];
return 0;
}