时间:2016-05-09 18:20:09 星期一
题目编号:[2016-05-09][51nod][1005 大数加法]
题目大意:大数 A + B,支持负数
#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<iomanip>using namespace std;const int DLEN = 4;const int MAXN = 9999;const int maxsize = 1E5;class BigNum{public: int a[5000]; int len,flg; BigNum(){len = flg = 1;memset(a,0,sizeof(a));} BigNum(const BigNum & T):len(T.len),flg(T.flg){ memset(a,0,sizeof(a)); for(int i = 0 ; i < len;++i){ a[i] = T.a[i]; } } friend int abscmp(const BigNum a,const BigNum b){//比较绝对值的大小 int ln; if(a.len > b.len) return 1; else if(a.len == b.len){ ln = a.len - 1; while(a.a[ln] == b.a[ln] && ln >=0) --ln; if(ln >= 0 && a.a[ln] > b.a[ln]) return 1; else return 0; }else return 0; } friend void sub(BigNum & t1, BigNum & t2){//t1 > t2,不考虑符号,t1 - t2,并且,并且结果直接在t1中生效 int i,j,big; big = t1.len; for(i = 0 ; i < big; ++i){ if(t1.a[i] < t2.a[i]){ j = i + 1; while(t1.a[j] == 0) ++j; t1.a[j--]--; while(j > i) t1.a[j--] += MAXN; t1.a[i] += MAXN + 1 - t2.a[i]; }else t1.a[i] -= t2.a[i]; } t1.len = big; while(t1.a[t1.len -1] == 0 && t1.len > 1){ --t1.len; --big; } } BigNum operator + (const BigNum & T)const{ //相加 if((flg == 0 && T.flg == 0) ||(flg && T.flg) ){ BigNum t(*this); int big; big = T.len > len ? T.len : len; for(int i = 0 ; i < big; ++i){ t.a[i] += T.a[i]; if(t.a[i] > MAXN){ ++t.a[i + 1]; t.a[i] -= MAXN + 1; } } if(t.a[big] != 0){ t.len = big + 1; }else t.len = big; t.flg = flg; return t; }else { int tflg; BigNum a,b; if(cmp(*this,T)){ a = *this; b = T; }else { a = T; b = *this; } sub(a,b); return a; } } friend istream& operator >> (istream & in,BigNum &b){ char ch[maxsize * 4]; int i = -1; in >> ch; int l = strlen(ch); int count = 0,sum = 0; int ed = 0; if(ch[0] == '-'){ b.flg = 0; ed = 1; } for(int i = l - 1 ; i >= ed ;){ sum = 0; int t = 1; for(int j = 0 ; j < 4 && i >= ed ; ++j,--i,t*=10){ sum += (ch[i] - '0') * t; } b.a[count++] =sum; } b.len = count++; return in; } friend ostream & operator << (ostream & out, const BigNum &b){ int i; if(b.flg == 0) out<<"-"; out<<b.a[b.len - 1]; for(i = b.len - 2 ; i >=0 ; --i){ out<<setw(4)<<setfill('0')<<b.a[i]; } return out; }};int main(){ BigNum a,b; cin>>a>>b; cout<<(a+b)<<"\n"; return 0;}