高精度乘高精度

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的。

举个例子:
在这里插入图片描述
借鉴:高精度运算(大数运算)

发布了107 篇原创文章 · 获赞 199 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/105256237