大数
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 }