C=A * B (A、B均是高精度数)
比如A=156,B=3,求A * B
很容易知道答案是468,怎样算的呢?
① 首先让3 * 6 = 18,然后向进一位,并且这位只保留8
② 让3 * 5 + 进位1 = 16,然后向前进一位,并且这位只保留6
③ 让3 * 1 + 进位1 = 4,此时不向前进位,保留4
所以最终答案是468
通过这个例子我们再来分析发现,C0 = A0 * B0,C1 = A1 * B0,C2 = A2 * B0,可以看出C的下标是和A、B下标相关的,0=0+0,1=1+0,2=2+0。
由此我们可以得出C[i+j] += A[i] * B[j]。
那么核心代码就出来了
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10; // 进位
c[i+j]%=10; //实际保留的值
完整代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[10000],b[10000],c[10000];
int main()
{
string a1,b1;
cin>>a1>>b1;
int lena=a1.size();
int lenb=b1.size();
for(int i=lena-1,j=0; i>=0; i--,j++) a[j]=a1[i]-'0';
for(int i=lenb-1,j=0; i>=0; i--,j++) b[j]=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[i+j+1]+=c[i+j]/10; // 进位
c[i+j]%=10; //实际保留的值
}
int lenc=lena+lenb-1; // 两位数相乘最大位数是lena+lenb ,-1是因为下标从0开始
while(c[lenc]==0 && lenc>0) lenc--; // 去前导0
for(int i=lenc; i>=0; i--)
{
cout<<c[i];
}
}
至于为什么是c[i+j]+=a[i]*b[j],而不是c[i+j]=a[i]*b[j],因为刚才上面的例子 B 是个一位数的,而实际中 B 是有很多位数字组成的,你要把那些都累加起来才能构成一个Ci的。
举个例子:
借鉴:高精度运算(大数运算)