[2016-05-09][51nod][1005 大数加法]

  • 时间:2016-05-09 18:20:09 星期一

  • 题目编号:[2016-05-09][51nod][1005 大数加法]

  • 题目大意:大数 A + B,支持负数

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<iostream>
  5. #include<iomanip>
  6. using namespace std;
  7. const int DLEN = 4;
  8. const int MAXN = 9999;
  9. const int maxsize = 1E5;
  10. class BigNum{
  11. public:
  12. int a[5000];
  13. int len,flg;
  14. BigNum(){len = flg = 1;memset(a,0,sizeof(a));}
  15. BigNum(const BigNum & T):len(T.len),flg(T.flg){
  16. memset(a,0,sizeof(a));
  17. for(int i = 0 ; i < len;++i){
  18. a[i] = T.a[i];
  19. }
  20. }
  21. friend int abscmp(const BigNum a,const BigNum b){//比较绝对值的大小
  22. int ln;
  23. if(a.len > b.len) return 1;
  24. else if(a.len == b.len){
  25. ln = a.len - 1;
  26. while(a.a[ln] == b.a[ln] && ln >=0) --ln;
  27. if(ln >= 0 && a.a[ln] > b.a[ln]) return 1;
  28. else return 0;
  29. }else return 0;
  30. }
  31. friend void sub(BigNum & t1, BigNum & t2){//t1 > t2,不考虑符号,t1 - t2,并且,并且结果直接在t1中生效
  32. int i,j,big;
  33. big = t1.len;
  34. for(i = 0 ; i < big; ++i){
  35. if(t1.a[i] < t2.a[i]){
  36. j = i + 1;
  37. while(t1.a[j] == 0) ++j;
  38. t1.a[j--]--;
  39. while(j > i) t1.a[j--] += MAXN;
  40. t1.a[i] += MAXN + 1 - t2.a[i];
  41. }else t1.a[i] -= t2.a[i];
  42. }
  43. t1.len = big;
  44. while(t1.a[t1.len -1] == 0 && t1.len > 1){
  45. --t1.len;
  46. --big;
  47. }
  48. }
  49. BigNum operator + (const BigNum & T)const{ //相加
  50. if((flg == 0 && T.flg == 0) ||(flg && T.flg) ){
  51. BigNum t(*this);
  52. int big;
  53. big = T.len > len ? T.len : len;
  54. for(int i = 0 ; i < big; ++i){
  55. t.a[i] += T.a[i];
  56. if(t.a[i] > MAXN){
  57. ++t.a[i + 1];
  58. t.a[i] -= MAXN + 1;
  59. }
  60. }
  61. if(t.a[big] != 0){
  62. t.len = big + 1;
  63. }else t.len = big;
  64. t.flg = flg;
  65. return t;
  66. }else {
  67. int tflg;
  68. BigNum a,b;
  69. if(cmp(*this,T)){
  70. a = *this;
  71. b = T;
  72. }else {
  73. a = T;
  74. b = *this;
  75. }
  76. sub(a,b);
  77. return a;
  78. }
  79. }
  80. friend istream& operator >> (istream & in,BigNum &b){
  81. char ch[maxsize * 4];
  82. int i = -1;
  83. in >> ch;
  84. int l = strlen(ch);
  85. int count = 0,sum = 0;
  86. int ed = 0;
  87. if(ch[0] == '-'){
  88. b.flg = 0;
  89. ed = 1;
  90. }
  91. for(int i = l - 1 ; i >= ed ;){
  92. sum = 0;
  93. int t = 1;
  94. for(int j = 0 ; j < 4 && i >= ed ; ++j,--i,t*=10){
  95. sum += (ch[i] - '0') * t;
  96. }
  97. b.a[count++] =sum;
  98. }
  99. b.len = count++;
  100. return in;
  101. }
  102. friend ostream & operator << (ostream & out, const BigNum &b){
  103. int i;
  104. if(b.flg == 0) out<<"-";
  105. out<<b.a[b.len - 1];
  106. for(i = b.len - 2 ; i >=0 ; --i){
  107. out<<setw(4)<<setfill('0')<<b.a[i];
  108. }
  109. return out;
  110. }
  111. };
  112. int main(){
  113. BigNum a,b;
  114. cin>>a>>b;
  115. cout<<(a+b)<<"\n";
  116. return 0;
  117. }


来自为知笔记(Wiz)


posted on 2016-05-09 18:21  红洋  阅读(169)  评论(0)    收藏  举报

导航