模拟/字符串处理 UVALive 6833 Miscalculatio
1 /*
2 模拟/字符串处理:主要是对*的处理,先把乘的预处理后再用加法,比如说是:1+2*3+4 = 1+..6+4 = 11
3 */
4 #include <cstdio>
5 #include <algorithm>
6 #include <cstring>
7 #include <string>
8 #include <cmath>
9 #include <vector>
10 #include <map>
11 #include <queue>
12 using namespace std;
13
14 typedef long long ll;
15 const int MAXN = 1e2 + 10;
16 const int INF = 0x3f3f3f3f;
17 char s[MAXN];
18 int len;
19
20 void solve(void)
21 {
22 int p1 = 0, p2 = 0;
23 for (int i=1; i<=len; ++i)
24 {
25 if (s[i] == '*')
26 {
27 p1 = p2 = i;
28 while (p1 >= 1 && s[p1] != '+') p1--; p1++;
29 while (p2 <= len && s[p2] != '+') p2++; p2--;
30 ll tmp = 0;
31 for (int j=p1; j<=p2; j+=2)
32 {
33 if (j == p1) tmp = s[j] - '0';
34 else tmp = tmp * (s[j] - '0');
35 }
36 // printf ("p1: %d p2: %d\ntmp: %d\n", p1, p2, tmp);
37 int p = p2;
38 while (tmp)
39 {
40 s[p--] = tmp % 10 + '0';
41 tmp /= 10;
42 }
43 for (int j=p1; j<=p; ++j) s[j] = '.';
44 }
45 }
46 }
47
48 int main(void) //UVALive 6833 Miscalculation
49 {
50 // freopen ("B.in", "r", stdin);
51
52 while (scanf ("%s", s + 1) == 1)
53 {
54 ll y; scanf ("%lld", &y);
55 ll sum_l = 0, sum_m = 0;
56
57 len = strlen (s + 1); char op; int x = 0;
58 for (int i=1; i<=len; ++i)
59 {
60 if (i & 1)
61 {
62 if (i == 1) sum_l = s[i] - '0';
63 else
64 {
65 if (op == '+') sum_l += s[i] - '0';
66 else sum_l = sum_l * (s[i] - '0');
67 }
68 }
69 else op = s[i];
70 }
71
72 solve ();
73 for (int i=1; i<=len; ++i)
74 {
75 if (s[i] == '.' || s[i] == '+') continue;
76 else if (s[i] >= '0' && s[i] <= '9')
77 {
78 ll res = 0; int j;
79 for (j=i; j<=len; ++j)
80 {
81 if (s[j] == '+') break;
82 res = res * 10 + (s[j] - '0');
83 }
84 sum_m += res;
85 i = j - 1;
86 }
87 }
88
89 if (y == sum_l && y == sum_m) puts ("U");
90 else if (y != sum_l && y != sum_m) puts ("I");
91 else
92 {
93 if (y == sum_l) puts ("L");
94 else puts ("M");
95 }
96
97 // printf ("%s\n", s + 1);
98 // printf ("%lld %lld \n", sum_l, sum_m);
99 }
100
101 return 0;
102 }
编译人生,运行世界!