高精度乘法实现

高精度乘法我们依然是使用竖式乘法的思路来解题。不过要注意的是,在高精度乘法中需要考虑下标问题。如下图

 我们可以看出,积的下标等于i(被乘数下标)+j(乘数下标)-1。这一步理解之后,我们来解决积长度的问题:可以看出,积的最大坐标等于乘数长度加被乘数长度,也就是lenc=i+j。

最后我们来整理思路:

1.创建数组存储数字

2.模拟竖式乘法

3.输出

接下来是代码:

1.创建数组并存储数字

char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},lena,lenb,c1[10001]={};//创建数组存储数字 
cin>>a>>b; //输入 
lena = strlen(a);
lenb = strlen(b);//获取长度 
for(int i=0;i<lena;i++){
	a1[lena-i] = a[i]-48;
}
for(int i=0;i<lenb;i++){
	b1[lenb-i] = b[i]-48;
}//从下标为1的地方开始逆序存储数字 

这里从下标为1开始存储是为了控制下标,具体参考上文i+j-1。

2.模拟竖式乘法

for(int i=1;i<=lena;i++){
	int x = 0;
	for(int j=1;j<=lenb;j++){
		c1[i+j-1] = a1[i]*b1[j]+x+c1[i+j-1];
		x = c1[i+j-1]/10;
		c1[i+j-1]%=10;
	}//乘法运算 
	c1[lenb+i] = x;
}

这里要注意每次乘下一个数时,进位需要重新赋值为0。如不赋值为0,则会加上上一个被乘数产生的进位,导致数值不正确。

3.输出

int lenc = lena+lenb;
while(c1[lenc]==0 && lenc>1){
	lenc--;//删除高位零 
}
for(int i=lenc;i>=1;i--){
	cout<<c1[i];
}//逆序输出

输出仍就是倒序输出,不过要最小到1,因为我们是从1开始倒序存储的。

删除高位零是因为我们声明的lenc(积的长度)是最大长度,而不是真实长度。也就会出现

10*10=0100的情况。但我们做判断是要注意留一位长度因为零乘任何数都等于0,否则将出现输入0时则没有输出的情况。

以下是代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	char a[1001]={},b[1001]={};
	int a1[1001]={},b1[1001]={},lena,lenb,c1[10001]={};//创建数组存储数字 
	cin>>a>>b; //输入 
	lena = strlen(a);
	lenb = strlen(b);//获取长度 
	for(int i=0;i<lena;i++){
		a1[lena-i] = a[i]-48;
	}
	for(int i=0;i<lenb;i++){
		b1[lenb-i] = b[i]-48;
	}//从下标为11的地方开始逆序存储数字 
	for(int i=1;i<=lena;i++){
		int x = 0;
		for(int j=1;j<=lenb;j++){
			c1[i+j-1] = a1[i]*b1[j]+x+c1[i+j-1];
			x = c1[i+j-1]/10;
			c1[i+j-1]%=10;
		}//乘法运算 
		c1[lenb+i] = x;
	}
	int lenc = lena+lenb;
	while(c1[lenc]==0 && lenc>1){
		lenc--;//删除高位零 
	}
	for(int i=lenc;i>=1;i--){
		cout<<c1[i];
	}//逆序输出 
	return 0;
}

好的下期我们更新高精度除法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值