51nod1005 ——大数加法【高精度】

1005 大数加法 

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

 收藏

 关注

给出2个大整数A,B,计算A+B的结果。

Input

第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)

Output

输出A + B

Input示例

68932147586
468711654886

Output示例

537643802472

直接套大数加法和减法的模板就可以了,这里有一个地方需要注意一下,因为A,B可能为负数,要考虑A为负数,B为正数。B为负数,A为正数。二者都为负数。三种特殊情况。因为大数减法模板适用于大的减去小的,所有这三种特殊情况要特判一下。

#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
const int L = 20010;

string add(string a, string b){
	string ans;
	int na[L] = {0}, nb[L] = {0};
	int la = a.size(), lb = b.size();
	for(int i = 0; i < la; i++) na[la-1-i] = a[i] - '0';
	for(int i = 0; i < lb; i++) nb[lb-1-i] = b[i] - '0';
	int lmax = la > lb ? la : lb;
	for(int i = 0; i < lmax; i++){
		na[i] += nb[i];
		na[i+1] += na[i]/10;
		na[i] %= 10;
	}
	if(na[lmax]) lmax++;
	for(int i = lmax-1; i >= 0;i--) ans += na[i] + '0';
	return ans;
}

string sub(string a, string b){
	string ans;
	int na[L] = {0},nb[L] = {0};
	int la = a.size(), lb = b.size();
	for(int i = 0; i< la; i++)
		na[la-1-i] = a[i] - '0';
	for(int i=0; i < lb; i++)
		nb[lb-1-i] = b[i] - '0';
	int lmax = la > lb ? la : lb;
	for(int i = 0; i < lmax; i++){
		na[i] -= nb[i];
		if(na[i] < 0) na[i] += 10,na[i+1]--;
	}
	while(!na[--lmax] && lmax > 0);
	lmax++;
	for(int i = lmax-1; i >= 0; i--)
		ans += na[i] + '0';
	return ans;
}

int main(){
	string a,b;
	while(cin>>a>>b){
        bool flag=false;
		if(a[0] == '-' && b[0] != '-'){
			a.erase(a.begin());
            flag = true;
			if(a.size() > b.size()){
				cout<<'-'<<sub(a,b)<<endl;
			}
			else if(a.size() < b.size()){
				cout<<sub(b,a)<<endl;
			}
			else if(a.size() == b.size() && a < b){
				cout<<sub(b,a)<<endl;
			}
			else if(a.size() == b.size() && a > b){
				cout<<'-'<<sub(a,b)<<endl;
			}
		}
		if(b[0] == '-' && a[0] != '-'){
			b.erase(b.begin());
			flag = true;
			if(b.size() > a.size()){
				cout<<'-'<<sub(b,a)<<endl;
			}
			else if(b.size() < a.size()){
				cout<<sub(a,b)<<endl;
			}
			else if(a.size() == b.size() && b < a){
				cout<<sub(a,b)<<endl;
			}
			else if(a.size() == b.size() && b > a){
				cout<<'-'<<sub(b,a)<<endl;
			}
		}
		if(a[0] =='-' && b[0] =='-'){
			a.erase(a.begin());
			b.erase(b.begin());
			flag = true;
			cout<<'-'<<add(a,b)<<endl;
		}
		if(a[0] !='-' && b[0] != '-' && !flag){
			cout<<add(a,b)<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiang_hehe/article/details/82014850