zoukankan      html  css  js  c++  java
  • 大数

      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 }
  • 相关阅读:
    (算法)堆与堆排序
    (笔试题)N!的三进制数尾部0的个数
    (笔试题)N!尾部连续0的个数
    程序员与编程一些鲜为人知的事实 软件遵循熵的定律
    关注职业发展,也要关注健康 别让老板杀了你
    其实,最好的年龄才刚刚开始
    你为什么就做不到呢? 正确的选择改变命运
    睡觉前为啥总是忍不住刷网页刷手机?
    中年程序员职业生涯另一选择:创业追寻自己的热情所在
    都很好的两人为何却没有好的婚姻 清楚对方的需要
  • 原文地址:https://www.cnblogs.com/SSYYGAM/p/4528269.html
Copyright © 2011-2022 走看看