[51NOD]大数加法(模拟)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005

要处理符号,还要特别注意0和连续进位等情况。偷懒使用strcmp,但是前提必须是长度相等,否则是字典序。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <fstream>
 8 #include <cassert>
 9 #include <cstdio>
10 #include <bitset>
11 #include <vector>
12 #include <deque>
13 #include <queue>
14 #include <stack>
15 #include <ctime>
16 #include <set>
17 #include <map>
18 #include <cmath>
19 
20 using namespace std;
21 
22 const int maxn = 11111;
23 char ca[maxn], cb[maxn], cs[maxn];
24 
25 void add(char* ca, char* cb) {
26     int a[maxn];
27     int b[maxn];
28     memset(a, 0, sizeof(a));
29     memset(b, 0, sizeof(b));
30     int la = strlen(ca);
31     int lb = strlen(cb);
32     for(int i = 0; i < la; i++) a[i] = ca[la-i-1] - '0';
33     for(int i = 0; i < lb; i++) b[i] = cb[lb-i-1] - '0';
34     for(int i = 0; i < maxn; i++) {
35         a[i] += b[i];
36         a[i+1] += a[i] / 10;
37         a[i] %= 10;
38     }
39     int p = maxn;
40     while(p--) if(a[p] != 0) break;
41     for(int i = p; i >= 0; i--) printf("%d", a[i]);
42     printf("\n");
43 }
44 
45 void sub(char* ca, char* cb) {
46     int a[maxn];
47     int b[maxn];
48     memset(a, 0, sizeof(a));
49     memset(b, 0, sizeof(b));
50     int la = strlen(ca);
51     int lb = strlen(cb);
52     for(int i = 0; i < la; i++) a[i] = ca[la-i-1] - '0';
53     for(int i = 0; i < lb; i++) b[i] = cb[lb-i-1] - '0';
54     for(int i = 0; i < la; i++) {
55         if(a[i] >= b[i]) a[i] -= b[i];
56         else {
57             a[i] = a[i] - b[i] + 10;
58             a[i+1]--;
59         }
60     }
61     int p = maxn;
62     while(p--) if(a[p] != 0) break;
63     for(int i = p; i >= 0; i--) printf("%d", a[i]);
64     printf("\n");
65 }
66 
67 int main() {
68     // freopen("in", "r", stdin);
69     memset(ca, 0, sizeof(ca));
70     memset(cb, 0, sizeof(cb));
71     scanf("%s %s", ca, cb);
72     int la = strlen(ca);
73     int lb = strlen(cb);
74     if(ca[0] == '0' && cb[0] == '0') printf("0\n");
75     else if(ca[0] == '-' && cb[0] == '-') {
76         printf("-");
77         add(ca+1, cb+1);
78     }
79     else if(ca[0] != '-' && cb[0] != '-') add(ca, cb);
80     else if(ca[0] == '-' && cb[0] != '-') {
81         if(la - 1 < lb) sub(cb, ca+1);
82         else if(strcmp(ca+1, cb) > 0) {
83             printf("-");
84             sub(ca+1, cb);
85         }
86         else if(strcmp(ca+1, cb) == 0) printf("0\n");
87         else sub(cb, ca+1);
88     }
89     else if(ca[0] != '-' && cb[0] == '-') {
90         if(la - 1 < lb) sub(ca, cb+1);
91         else if(strcmp(ca, cb+1) > 0) sub(ca, cb+1);
92         else if(strcmp(ca, cb+1) == 0) printf("0\n");
93         else {
94             printf("-");
95             sub(cb+1, ca);
96         }
97     }
98     return 0;
99 }

 

posted @ 2016-04-19 14:58  Kirai  阅读(239)  评论(0)    收藏  举报