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
手推的板子,直接进行位数加减模拟即可。注意进位。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10050;
void bigplus(string a,string b){
int ra[maxn];
int rb[maxn];
int ans[maxn];
int l1=a.length();
int l2=b.length();
for(int i=0;i<l1;i++){
ra[i]=a[i]-'0';
}
for(int i=0;i<l2;i++){
rb[i]=b[i]-'0';
}
reverse(ra,ra+l1);
reverse(rb,rb+l2);
for(int i=0;i<l1||i<l2;i++){
if(ra[i]+rb[i]>9){
ans[i]=ra[i]+rb[i]-10;
ra[i+1]++;
}
else{
ans[i]=ra[i]+rb[i];
}
}
if(ra[max(l1,l2)]) cout<<ra[max(l1,l2)];
for(int i=max(l1,l2)-1;i>=0;i--){
cout<<ans[i];
}
puts("");
}
void bigsub(string a,string b){
int ra[maxn];
int rb[maxn];
int ans[maxn];
int l1=a.length();
int l2=b.length();
for(int i=0;i<l1;i++){
ra[i]=a[i]-'0';
}
for(int i=0;i<l2;i++){
rb[i]=b[i]-'0';
}
reverse(ra,ra+l1);
reverse(rb,rb+l2);
for(int i=0;i<l1;i++){
if(ra[i]-rb[i]>=0){
ans[i]=ra[i]-rb[i];
}
else{
ans[i]=(10+ra[i]-rb[i]);
ra[i+1]--;
}
}
int id;
for(int i=l1-1;i>=0;i--){
if(ans[i]){
id=i;
break;
}
}
for(int i=id;i>=0;i--){
cout<<ans[i];
}
puts("");
// reverse(c.begin(),b.end());
// return c;
}
int Max(string a,string b){
if(a.length()==b.length()){
return a>b;
}
return a.length()>b.length();
}
int main(){
string a,b;
string c,d;
cin>>a>>b;
int l1=a.length();
int l2=b.length();
if(a[0]!='-'&&b[0]!='-'){
bigplus(a,b);
}
else if(a[0]=='-'&&b[0]=='-'){
c=a.substr(1,l1-1);
d=b.substr(1,l2-1);
cout<<"-";
bigplus(c,d);
}
else if(a[0]=='-'&&b[0]!='-'){
c=a.substr(1,l1-1);
if(Max(c,b)){
cout<<"-";
bigsub(c,b);
}
else{
bigsub(b,c);
}
}
else {
c=b.substr(1,l2-1);
if(Max(c,a)){
cout<<"-";
bigsub(c,a);
}
else bigsub(a,c);
}
return 0;
}