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 }