高精度乘法的实现

         这是C++算法基础-基础算法专栏的第九篇文章,专栏详情请见此处


引入

        上次我们学习了高精度减法的实现,这次我们要学习高精度乘法的实现。

        高精度乘法与高精度加法的定义、前置过程都是大致相同的,如果想了解具体内容,可以移步至我的这篇博客:高精度加法计算的实现

        在这里就不再详细讲解,只讲解主体过程qwq

        这里需要说明,此博客(包括后面一篇),都是实现两个高精度数之间的计算,而算法基础课中仅仅实现了一个高精度数和一个低精度数之间的计算,思路和代码上两者有所不同。

主体过程

        呃,高精度乘高精度先等会儿,我们先看一种简单的情况。

        高精度乘低精度

        高精度乘低精度的原理和小学学习的竖式乘法是一样的。

        

         概括来说,从个位开始,将低精度乘数与高精度乘数的每一位相乘,存进积的对应位置上,若当前位达到10进位,也就是将下一位加上当前位(整)除以10,并把当前位模10

        89\times 123用高精度计算(123为高精度乘数,89为低精度乘数),先乘个位,3\times 89267,发现267大于等于10,所以将267(整)除以10,得26,将其存入答案的十位,再将26710,得7,将其存入答案的个位;

        再乘十位,2\times 89+26204,发现204大于等于10,所以将204(整)除以10,得20,将其存入答案的百位,再将20410,得4,将其存入答案的十位;

        再乘百位,1\times 89+20109,发现109大于等于10,所以将109(整)除以10,得10,将其存入答案的千位,再将10910,得9,将其存入答案的百位;

        最后,千位的10大于等于10,所以将10(整)除以10,得1,将其存入答案的万位,再将1010,得0,将其存入答案的千位;得到答案10947

        高精度乘高精度

        我们通过高精度乘低精度可以看出,运算89\times 123,实际就是将123分解成1\times 10^{2}+2\times 10^{1}+3\times 10^{0},再分别用每一位去乘89

        高精度乘高精度也是一样的。若还想计算高精度乘高精度的89 \times 123,我们就可以受高精度乘低精度的启发,将89123分解成8 \times 10^{1}+9\times 10^{0}1\times 10^{2}+2\times 10^{1}+3\times 10^{0},再分别相乘,即9\times 10^{0}\times 3\times 10^{0}+8 \times 10^{1}\times 3\times 10^{0}+9\times 10^{0}\times 2\times 10^{1}+8 \times 10^{1}\times 2\times 10^{1}+9\times 10^{0}\times 1\times 10^{2}+8 \times 10^{1}\times 1\times 10^{2},化简,得9\times 3\times 10^{0}+8 \times 3\times 10^{1}+9\times 2\times 10^{1}+8 \times 2\times 10^{2}+9\times 1\times 10^{2}+8 \times 1\times 10^{3}

        从这个复杂的式子上可以看出,若当前两个乘数分别的位置ij相乘时,答案会存储在i+j这个位置上。

        嗯,有点复杂,结合代码食用会好一些。

代码

        下面给出高精度乘法的代码:

void mul(int a[],int b[],int c[]){
	clear(c);
	for(int i=0;i<L-1;i++){
		for(int j=0;j<=i;j++)
			c[i]+=a[j]*b[i-j];
		if(c[i]>=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
	}
}

上一篇-高精度减法的实现    C++算法基础专栏文章    下一篇-高精度除法的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值