高精度算法之高精度加法

小学时,我们都学过加法,1+1=2

回忆计算加法有哪些注意事项?
       1. 进位
       2. 从低位到高位
       3. 对齐

在做一些题时,int  (-2^31---2^31-1)  ,long long    (-2^631---2^63-1)都不能满足做题需要,

有些题,例如:

【题目描述】

输入两个不超过500位的正整数 ,

求这两个数的和是多少。

【输入样例】

998877665544332211

1234

【输出样例】 998877665544333445

这种题,500位数字,long long 都不能解决,更何况int类型了。

这种A+Bproblem,我们就可以用高精度加法。

首先,先编好框架

# include  <bits/stdc++.h>  //万能头文件
using namespace std;
int main(){

return 0;
}

接着,定义几个全局变量,用字符串存放输入数据  , 保存加数,算出长度。

# include  <bits/stdc++.h>  //万能头文件
using namespace std;

string x,y;                //用字符串存放输入数据
int a[550];                //保存加数 1
int b[550];               //保存加数 2
int sum[550];             //保存和

int main(){
    cin >> x >> y;        //输入       
    int lenx = x.size();  //算出长度1
	int leny = y.size();  //算出长度2
return 0;
}

为了数位对齐,我们将字符串中的数据,逆向输入到int数组中,注意转换格式,如下

for(int i = 0;i < lenx; i++){
		a[i] = x[lenx-i-1]-'0'; 
	}
for(int i = 0;i < leny; i++){
		b[i] = y[leny-i-1]-'0';
	}

再,模拟求和:

int l = max(lenx,leny);
for(int i = 0;i < l; i++){
	sum[i] = a[i]+b[i];//模拟求和 
}

下面,我们不要忘记进位:

for(int i = 0;i < l; i++){
		sum[i+1] += sum[i]/10;//模拟进位 
		sum[i] %= 10;
	}

如果这时,我们直接方向输出的话,就会发现,如果样例进位了,则十分正常,但如果没有进位,则会在开头多出一个0,我们只需要判断后,删掉那个0就行.

if(sum[l] == 0){///判断我的最高位是否有进位,没有进位就删0 
		l--;
	} 

最后,反序输出:

for(int i = l;i >= 0; i--){
		cout << sum[i];
	}

这就是高精度加法运算。

以下需要注意几个事项:

1、最高位没有进位 就需删0
2、最高位有进位 就没0
3、输入要通过字符串进行输入

接下来是一个完整程序:

#include <bits/stdc++.h>
using namespace std;
string x,y;///用来保存输入 
int a[550];//保存被加数 
int b[550];//保存加数 
int sum[550]; 
int main(){
	cin >> x >> y;
	int lenx = x.size();
	int leny = y.size();
	
	for(int i = 0;i < lenx; i++){
		a[i] = x[lenx-i-1]-'0'; 
	}
	for(int i = 0;i < leny; i++){
		b[i] = y[leny-i-1]-'0';
	}
	
	int l = max(lenx,leny);
	for(int i = 0;i < l; i++){
		sum[i] = a[i]+b[i];//模拟求和 
	}
	
	for(int i = 0;i < l; i++){
		sum[i+1] += sum[i]/10;//模拟进位 
		sum[i] %= 10;
	}
	
	if(sum[l] == 0){///判断我的最高位是否有进位,没有进位就删0 
		l--;
	} 
	for(int i = l;i >= 0; i--){
		cout << sum[i];
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值