高精度加法实现

 

关于高精度加法的实现可以理解为小学学习的竖式加法如下图

从各位开始按位相加,9+1=10那么我们进位1余数0,随后就是9+1+1(上一次的进位) =11商1余数1。以此类推,最后得出答案为1110。

这个过程可以由数组来模拟,我们即可得出解题思路:

1.创建三个数组分别用来存储两个加数与和

2.模拟竖式加法

3.输出和

以下是代码:

1.创建数组并且输入加数

char a[1001]={},b[1001]={}; 
int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//声明并初始化需要的数组 
cin>>a>>b;//输入数字 
lena = strlen(a);
lenb = strlen(b);//获取长度 
for(int i=0;i<lena;i++){
	a1[lena-i-1] = a[i]-48;
}
for(int i=0;i<lenb;i++){
	b1[lenb-i-1] = b[i]-48;
}//倒序存储

这一步倒序存储的原因是为了下面模拟竖式加法 。

2.模拟竖式加法

int lenc=0,x=0;//声明和的长度(lenc)和进位(x) 
int maxlen=max(lena,lenb);//找到加法次数(即最长的加数数组) 
while(lenc<maxlen){
	c1[lenc] = a1[lenc]+b1[lenc]+x;//和=加数+加数+上一次的进位 
	x = c1[lenc]/10;//进位=和/10 
	c1[lenc] = c1[lenc]%10;//最终的和= 和%10 
	lenc++;//使和的长度加一 
}
if(x>0){//判断若最高位任然有进位 
	c1[lenc]=x;//最高位等于进位 
	lenc++;//使和的长度加1 
}

在这一步,要注意最高位任然可能有进位,所以要额外判断一次 。

3.倒序输出和

for(int i=lenc-1;i>=0;i--){
	cout<<c1[i];
}//倒序输出 

因为存储是倒序,所以也倒序输出。

最后是该题的完整代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	char a[1001]={},b[1001]={}; 
	int a1[1001]={},b1[1001]={},lena,lenb,c1[1001]={};//声明并初始化需要的数组 
	cin>>a>>b;//输入数字 
	lena = strlen(a);
	lenb = strlen(b);//获取长度 
	for(int i=0;i<lena;i++){
		a1[lena-i-1] = a[i]-48;
	}
	for(int i=0;i<lenb;i++){
		b1[lenb-i-1] = b[i]-48;
	}//倒序存储; 
	int lenc=0,x=0;//声明和的长度(lenc)和进位(x) 
	int maxlen=max(lena,lenb);//找到加法次数(即最长的加数数组) 
	while(lenc<maxlen){
		c1[lenc] = a1[lenc]+b1[lenc]+x;//和=加数+加数+上一次的进位 
		x = c1[lenc]/10;//进位=和/10 
		c1[lenc] = c1[lenc]%10;//最终的和= 和%10 
		lenc++;//使和的长度加一 
	}
	if(x>0){//判断若最高位任然有进位 
		c1[lenc]=x;//最高位等于进位 
		lenc++;//使和的长度加1 
	}
	for(int i=lenc-1;i>=0;i--){
		cout<<c1[i];
	}//倒序输出 
	
	return 0;
}

下期更新高精度减法。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值