51NOD 1005 大数加法

给出2个大整数A,B,计算A+B的结果。
 
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472

解:不难,就是有些麻烦。。。
  1 #include<stdio.h>
  2 #include<string.h>
  3 
  4 #define MAX 10000005
  5 
  6 char a[MAX], b[MAX], c[MAX], max[MAX], min[MAX];
  7 int alen, blen, len;
  8 
  9 void add();
 10 
 11 void sub();
 12 void cmp();
 13 
 14 int main()
 15 {
 16     while (scanf_s("%s%s", a,MAX, b,MAX) != EOF)
 17     {
 18         memset(c, 0, sizeof c);
 19         alen = strlen(a);
 20         blen = strlen(b);
 21         len = alen > blen ? alen : blen;
 22         if ((a[0] != '-'&&b[0] != '-') || (a[0] == '-'&&b[0] == '-')) add();
 23         else sub();
 24     }
 25     return 0;
 26 }
 27 
 28 void add()
 29 {
 30     if (a[0] == '-')
 31     {
 32         printf("-");
 33         a[0] = b[0] = '0';
 34     }
 35     for (int i = len , j = 1; i > 0; i--, j++)
 36     {
 37         if (alen - j < 0) { alen++; a[0] = '0'; }
 38         if (blen - j < 0) { blen++; b[0] = '0'; }
 39         if ((c[i] += a[alen - j] + b[blen - j] - '0') > '9')
 40         {
 41             c[i] -= 10;
 42             c[i - 1] += 1;
 43         }
 44     }
 45     if (c[0] == 1) printf("1%s\n", &c[1]);
 46     else if (c[2] == 0 && c[1] == '0') printf("0\n");
 47     else if(c[1]=='0') printf("%s\n", &c[2]);
 48     else printf("%s\n", &c[1]);
 49 }
 50 
 51 void sub()
 52 {
 53     int i;
 54     cmp();
 55     alen = strlen(max);
 56     blen = strlen(min);
 57     for (i = 1; i <= len; i++)
 58     {
 59         if (blen - i<0) { min[0] = '0'; blen++; }
 60         if ((c[len - i] += max[alen - i] - min[blen - i] + '0')<'0')
 61         {
 62             c[len - i] += 10;
 63             c[len - i - 1] -= 1;
 64         }
 65     }
 66     i = 0;
 67     while (c[i] == '0')
 68     {
 69         if (i == len - 1)
 70         {
 71             printf("%c\n", c[len - 1]);
 72             break;
 73         }
 74         i++;
 75     }
 76     if (c[i] != '0')printf("%s\n", &c[i]);
 77 }
 78 
 79 void cmp()
 80 {
 81     if (a[0] == '-')
 82     {
 83         if (alen - 1 > blen)
 84         {
 85             len--;
 86             strcpy_s(max, MAX + 1, &a[1]);
 87             strcpy_s(min, MAX + 1, b);
 88             printf("-");
 89             return;
 90         }
 91         else if (alen - 1 < blen)
 92         {
 93             strcpy_s(max, MAX + 1, b);
 94             strcpy_s(min, MAX + 1, &a[1]);
 95             return;
 96         }
 97         else if (strcmp(&a[1], b) > 0)
 98         {
 99             len--;
100             strcpy_s(max, MAX + 1, &a[1]);
101             strcpy_s(min, MAX + 1, b);
102             printf("-");
103             return;
104         }
105         else
106         {
107             len--;
108             strcpy_s(max, MAX + 1, b);
109             strcpy_s(min, MAX + 1, &a[1]);
110             return;
111         }
112     }
113     else
114     {
115         if (alen > blen - 1)
116         {
117             strcpy_s(max, MAX + 1, a);
118             strcpy_s(min, MAX + 1, &b[1]);
119             return;
120         }
121         else if (alen < blen - 1)
122         {
123             len--;
124             strcpy_s(max, MAX + 1, &b[1]);
125             strcpy_s(min, MAX + 1, a);
126             printf("-");
127             return;
128         }
129         else if (strcmp(a, &b[1]) >= 0)
130         {
131             len--;
132             strcpy_s(max, MAX + 1, a);
133             strcpy_s(min, MAX + 1, &b[1]);
134             return;
135         }
136         else
137         {
138             len--;
139             strcpy_s(max, MAX + 1, &b[1]);
140             strcpy_s(min, MAX + 1, a);
141             printf("-");
142             return;
143         }
144     }
145 }

 

posted @ 2018-09-11 13:38  Ekalos  阅读(144)  评论(0编辑  收藏  举报