1 #include <iostream>
2
3 #include <string>
4
5 using namespace std;
6
7
8
9 inline int compare(string str1, string str2)
10
11 {
12
13 if(str1.size() > str2.size()) //长度长的整数大于长度小的整数
14
15 return 1;
16
17 else if(str1.size() < str2.size())
18
19 return -1;
20
21 else
22
23 return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1
24
25 }
26
27 //高精度加法
28
29 string ADD_INT(string str1, string str2)
30
31 {
32
33 string MINUS_INT(string str1, string str2);
34
35 int sign = 1; //sign 为符号位
36
37 string str;
38
39 if(str1[0] == '-') {
40
41 if(str2[0] == '-') {
42
43 sign = -1;
44
45 str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1));
46
47 }else {
48
49 str = MINUS_INT(str2, str1.erase(0, 1));
50
51 }
52
53 }else {
54
55 if(str2[0] == '-')
56
57 str = MINUS_INT(str1, str2.erase(0, 1));
58
59 else {
60
61 //把两个整数对齐,短整数前面加0补齐
62
63 string::size_type l1, l2;
64
65 int i;
66
67 l1 = str1.size(); l2 = str2.size();
68
69 if(l1 < l2) {
70
71 for(i = 1; i <= l2 - l1; i++)
72
73 str1 = "0" + str1;
74
75 }else {
76
77 for(i = 1; i <= l1 - l2; i++)
78
79 str2 = "0" + str2;
80
81 }
82
83 int int1 = 0, int2 = 0; //int2 记录进位
84
85 for(i = str1.size() - 1; i >= 0; i--) {
86
87 int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) % 10; //48 为 '0' 的ASCII码
88
89 int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10;
90
91 str = char(int1 + 48) + str;
92
93 }
94
95 if(int2 != 0) str = char(int2 + 48) + str;
96
97 }
98
99 }
100
101 //运算后处理符号位
102
103 if((sign == -1) && (str[0] != '0'))
104
105 str = "-" + str;
106
107 return str;
108
109 }
110
111
112
113
114
115 //高精度减法
116
117 string MINUS_INT(string str1, string str2)
118
119 {
120
121 string MULTIPLY_INT(string str1, string str2);
122
123 int sign = 1; //sign 为符号位
124
125 string str;
126
127 if(str2[0] == '-')
128
129 str = ADD_INT(str1, str2.erase(0, 1));
130
131 else {
132
133 int res = compare(str1, str2);
134
135 if(res == 0) return "0";
136
137 if(res < 0) {
138
139 sign = -1;
140
141 string temp = str1;
142
143 str1 = str2;
144
145 str2 = temp;
146
147 }
148
149 string::size_type tempint;
150
151 tempint = str1.size() - str2.size();
152
153 for(int i = str2.size() - 1; i >= 0; i--) {
154
155 if(str1[i + tempint] < str2[i]) {
156
157 str1[i + tempint - 1] = char(int(str1[i + tempint - 1]) - 1);
158
159 str = char(str1[i + tempint] - str2[i] + 58) + str;
160
161 }
162
163 else
164
165 str = char(str1[i + tempint] - str2[i] + 48) + str;
166
167 }
168
169 for(i = tempint - 1; i >= 0; i--)
170
171 str = str1[i] + str;
172
173 }
174
175 //去除结果中多余的前导0
176
177 str.erase(0, str.find_first_not_of('0'));
178
179 if(str.empty()) str = "0";
180
181 if((sign == -1) && (str[0] != '0'))
182
183 str = "-" + str;
184
185 return str;
186
187 }
188
189
190
191 //高精度乘法
192
193 string MULTIPLY_INT(string str1, string str2)
194
195 {
196
197 int sign = 1; //sign 为符号位
198
199 string str;
200
201 if(str1[0] == '-') {
202
203 sign *= -1;
204
205 str1 = str1.erase(0, 1);
206
207 }
208
209 if(str2[0] == '-') {
210
211 sign *= -1;
212
213 str2 = str2.erase(0, 1);
214
215 }
216
217 int i, j;
218
219 string::size_type l1, l2;
220
221 l1 = str1.size(); l2 = str2.size();
222
223 for(i = l2 - 1; i >= 0; i --) { //实现手工乘法
224
225 string tempstr;
226
227 int int1 = 0, int2 = 0, int3 = int(str2[i]) - 48;
228
229 if(int3 != 0) {
230
231 for(j = 1; j <= (int)(l2 - 1 - i); j++)
232
233 tempstr = "0" + tempstr;
234
235 for(j = l1 - 1; j >= 0; j--) {
236
237 int1 = (int3 * (int(str1[j]) - 48) + int2) % 10;
238
239 int2 = (int3 * (int(str1[j]) - 48) + int2) / 10;
240
241 tempstr = char(int1 + 48) + tempstr;
242
243 }
244
245 if(int2 != 0) tempstr = char(int2 + 48) + tempstr;
246
247 }
248
249 str = ADD_INT(str, tempstr);
250
251 }
252
253 //去除结果中的前导0
254
255 str.erase(0, str.find_first_not_of('0'));
256
257 if(str.empty()) str = "0";
258
259 if((sign == -1) && (str[0] != '0'))
260
261 str = "-" + str;
262
263 return str;
264
265 }
266
267 //高精度除法
268
269 string DIVIDE_INT(string str1, string str2, int flag)
270
271 {
272
273 //flag = 1时,返回商; flag = 0时,返回余数
274
275 string quotient, residue; //定义商和余数
276
277 int sign1 = 1, sign2 = 1;
278
279 if(str2 == "0") { //判断除数是否为0
280
281 quotient = "ERROR!";
282
283 residue = "ERROR!";
284
285 if(flag == 1) return quotient;
286
287 else return residue;
288
289 }
290
291 if(str1 == "0") { //判断被除数是否为0
292
293 quotient = "0";
294
295 residue = "0";
296
297 }
298
299 if(str1[0] == '-') {
300
301 str1 = str1.erase(0, 1);
302
303 sign1 *= -1;
304
305 sign2 = -1;
306
307 }
308
309 if(str2[0] == '-') {
310
311 str2 = str2.erase(0, 1);
312
313 sign1 *= -1;
314
315 }
316
317 int res = compare(str1, str2);
318
319 if(res < 0) {
320
321 quotient = "0";
322
323 residue = str1;
324
325 }else if(res == 0) {
326
327 quotient = "1";
328
329 residue = "0";
330
331 }else {
332
333 string::size_type l1, l2;
334
335 l1 = str1.size(); l2 = str2.size();
336
337 string tempstr;
338
339 tempstr.append(str1, 0, l2 - 1);
340
341 //模拟手工除法
342
343 for(int i = l2 - 1; i < l1; i++) {
344
345 tempstr = tempstr + str1[i];
346
347 for(char ch = '9'; ch >= '0'; ch --) { //试商
348
349 string str;
350
351 str = str + ch;
352
353 if(compare(MULTIPLY_INT(str2, str), tempstr) <= 0) {
354
355 quotient = quotient + ch;
356
357 tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str));
358
359 break;
360
361 }
362
363 }
364
365 }
366
367 residue = tempstr;
368
369 }
370
371 //去除结果中的前导0
372
373 quotient.erase(0, quotient.find_first_not_of('0'));
374
375 if(quotient.empty()) quotient = "0";
376
377 if((sign1 == -1) && (quotient[0] != '0'))
378
379 quotient = "-" + quotient;
380
381 if((sign2 == -1) && (residue[0] != '0'))
382
383 residue = "-" + residue;
384
385 if(flag == 1) return quotient;
386
387 else return residue;
388
389 }
390
391
392
393 //高精度除法,返回商
394
395 string DIV_INT(string str1, string str2)
396
397 {
398
399 return DIVIDE_INT(str1, str2, 1);
400
401 }
402
403 //高精度除法,返回余数
404
405 string MOD_INT(string str1, string str2)
406
407 {
408
409 return DIVIDE_INT(str1, str2, 0);
410
411 }
412
413
414
415 int main()
416
417 {
418
419 char ch;
420
421 string s1, s2, res;
422
423 while(cin >> ch) {
424
425 cin >> s1 >> s2;
426
427 switch(ch) {
428
429 case '+': res = ADD_INT(s1, s2); break; //高精度加法
430
431 case '-': res = MINUS_INT(s1, s2); break; //高精度减法
432
433 case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法
434
435 case '/': res = DIV_INT(s1, s2); break; //高精度除法,返回商
436
437 case 'm': res = MOD_INT(s1, s2); break; //高精度除法,返回余数
438
439 default : break;
440
441 }
442
443 cout << res << endl;
444
445 }
446
447 return(0);
448
449 }