基准时间限制: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;
}