高精度加法(大整数加法)(C++)

算法思想:

1.将大整数储存到数组中(倒序储存,因为这样方便进位)

2.当同位的数相加大于10后进位

3.加法完成后倒序输出

补充知识:

1.vector相关用法:(可以参考这位博主的文章)

https://blog.csdn.net/wkq0825/article/details/82255984?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164869598016780265480181%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164869598016780265480181&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-82255984.142^v5^pc_search_insert_es_download,143^v6^register&utm_term=vector&spm=1018.2226.3001.4187https://blog.csdn.net/wkq0825/article/details/82255984?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164869598016780265480181%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164869598016780265480181&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-82255984.142%5Ev5%5Epc_search_insert_es_download,143%5Ev6%5Eregister&utm_term=vector&spm=1018.2226.3001.41872.auto相关用法:

C++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型

3.&(引用):

使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,相当于复制了一遍。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效 率和所占空间都好。

代码如下:

#include <iostream>
#include <vector>
//
//无多余前导0时 
using namespace std;

//C = A + B
vector<int> add(vector<int> &A,vector<int> &B){
	vector<int> C;
	
	int t = 0;//进位 
	for(int i = 0;i<A.size()||i<B.size();i++){
		if(i<A.size()){
			t += A[i];
		}
		if(i<B.size()){
			t += B[i];
		}
		C.push_back(t%10);
		t /= 10;
	}
	
	if(t){
		C.push_back(1);
	}
	return C;
}

int main(){
	string a,b;
	vector<int>A,B;
	
	cin>>a>>b;
	for(int i = a.size()-1;i>=0;i--){
		A.push_back(a[i]-'0');
	}
	for(int i = b.size()-1;i>=0;i--){
		B.push_back(b[i]-'0');
	}
	
	vector<int> C = add(A,B);
	
	for(int i = C.size()-1;i>=0;i--){
		cout<<C[i];
	}
	return 0;
}

是否发现上面的代码没有解决前导0的问题,如 02+02=4,上方代码结果为04

解决方法如下:

将代码段

	for(int i = C.size()-1;i>=0;i--){
		cout<<C[i];
	}

替换为代码段

	int flag = 0;
	for(int i = C.size()-1;i>=0;i--){
		if(C[i]!=0){
			flag = 1;
		}
		if(flag){
			cout<<C[i];
		}
	}
	if(!flag){//注意0+0=0的处理 
		cout<<0;
	}

既可解决,但要注意0+0=0的特殊处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值