C++ 高精度加法

背景:
我们为什么要研究高精度加法?
因为普通的变量存不下我们的计算结果,也存不下我们的加数和被加数

思路:
我们如何做呢?来一起分析一下
我们知道我们人类手工计算大数相加时我们也不可能直接计算出来,我们是先将两个数写下来,在逐位相加,最后得到相加的结果,
既然计算机模仿人,那么我们可以用数组存储每位数字
然后…写不下去了,直接上代码233,代码很详细

#include<iostream>
#include<cstring>
#define size 9999

using namespace std;
//1.存储大数
//2.大数相加
//3.输出结果
int main() {

	int t;
	cin>>t;
	while(t--) {
		//存储大数
		int a[size]= {0},b[size]= {0},c[size]= {0};
		string A,B;
		cin>>A;
		cin>>B;
		int len_a=A.length(),len_b=B.length();
		//将字符串A中存放的字符转为数字逆序存储在a数组中,
		for(int i=0; i<len_a; i++) {
			a[i]=(A[(len_a-1)-i]-'0');
		}
		//B->b[]
		for(int i=0; i<len_b; i++) {
			b[i]=(B[(len_b-1)-i]-'0');
		}
		//相加操作
		//判断结果的长度
		int len_c=(len_a>len_b)?len_a:len_b;

		int p,flag=0;
		for(int i=0; i<len_c; i++) {
			p=a[i]+b[i]+flag;
			if(i==len_c-1&&p>=10)//如果结果的最高位>=10则,len_c+1
				len_c+=1;

			if(p>=10) {
				c[i]=p%10;
				flag=1;//保存进位
			} else {
				flag=0;
				c[i]=p;
			}
		}
		//逆序输出结果
		for(int i=len_c-1; i>=0; i--) {//将len_c的长度需要判断更加严格,将00222等的结果的零除去,就是如果结果开头为零,就将开头的零除去 
			if(c[i]==0&&c[i-1]==0||c[i]==0&&c[i-1]!=0) {
				len_c--;
			}
			if(c[i]!=0) {
				break;
			}
		}
		for(int i=len_c-1; i>=0; i--) {//逆序输出结果 
			cout<<c[i];
		}
		cout<<endl;
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值