zoukankan      html  css  js  c++  java
  • 大数四则运算java(转)

      1 // 大数的四则运算
      2 #include <iostream>
      3 #include <string>
      4 #include <algorithm>
      5 using namespace std;
      6 
      7 class BIGINTEGEROPERATIONS
      8 {
      9 private:
     10     static int COMPARE(string number1, string number2)
     11     {
     12         int j;
     13 
     14         int length1 = number1.size();
     15         int length2 = number2.size();
     16 
     17         if(number1.size() == 0) number1 = "0";
     18         if(number2.size() == 0) number2 = "0";
     19 
     20         j = 0;
     21         for(int i = 0; i < length1; ++i)
     22         {
     23             if(number1[i] == '0') ++j;
     24             else break;
     25         }
     26         number1 = number1.substr(j);
     27 
     28         j = 0;
     29         for(int i = 0; i < length2; ++i)
     30         {
     31             if(number2[i] == '0') ++j;
     32             else break;
     33         }
     34         number2 = number2.substr(j);
     35 
     36         length1 = number1.size();
     37         length2 = number2.size();
     38 
     39         if(length1 > length2)
     40         {
     41             return 1;
     42         }
     43         else if(length1 == length2)
     44         {
     45             if(number1.compare(number2) > 0)
     46             {
     47                 return 1;
     48             }
     49             else if(number1.compare(number2) == 0)
     50             {
     51                 return 0;
     52             }
     53             else
     54             {
     55                 return -1;
     56             }
     57         }
     58         else 
     59         {
     60             return -1;
     61         }
     62 
     63         return 0;
     64     }
     65 
     66 public:
     67     static string PLUS(string number1,string number2)
     68     {
     69         int i;
     70         int length1 = number1.size();
     71         int length2 = number2.size();
     72 
     73         string result="";
     74 
     75         reverse(number1.begin(), number1.end());
     76         reverse(number2.begin(), number2.end());
     77 
     78         for(i = 0; i < length1 && i < length2; i++)
     79         {
     80             char c = (char)(number1[i] + number2[i] - 48);
     81             result = result + c;
     82         }
     83 
     84         while(i < length1)
     85         {
     86             result = result + number1[i]; 
     87             ++i;
     88         }
     89 
     90         while(i < length2)
     91         {
     92             result = result + number2[i]; 
     93             ++i;
     94         }
     95    
     96         int carry = 0;
     97         for(i = 0; i < (int)result.size(); ++i)
     98         {
     99             int value = result[i] - 48 + carry;
    100             result[i] = (char)(value % 10 + 48);
    101             carry = value / 10;
    102         }
    103    
    104         if(carry !=0 ) 
    105         {
    106             result = result + (char)(carry + 48);
    107         }
    108 
    109         for(i = result.size() - 1; i >= 0; i--)
    110         {
    111             if(result[i] != '0') break;
    112         }
    113 
    114         result = result.substr(0, i + 1);
    115 
    116         reverse(result.begin(), result.end());
    117         if(result.length() == 0) result = "0";
    118         return result;
    119     }
    120 
    121 
    122     static string MINUS(string number1,string number2)
    123     {
    124         int i;
    125         string result = "";
    126 
    127         int length1 = number1.size();
    128         int length2 = number2.size();
    129 
    130         if(COMPARE(number2,number1) > 0)
    131         {
    132             return "-" + MINUS(number2, number1);
    133         }
    134 
    135         reverse(number1.begin(),number1.end());
    136         reverse(number2.begin(),number2.end());
    137     
    138         for(i = 0; i < length1 && i < length2; i++)
    139         {
    140             char c = number1[i] - number2[i] + 48;
    141             result = result + c;
    142         }
    143 
    144         if(i < length1)
    145         {
    146             for(; i < length1; i++)
    147             {
    148                 result = result + number1[i];
    149             }
    150         }
    151    
    152         int carry = 0;
    153         for(i = 0; i < (int)result.length(); i++)
    154         {
    155             int value = result[i] - 48 + carry;
    156             if(value < 0)
    157             {
    158                 value = value + 10;
    159                 carry = -1;
    160             }
    161             else carry = 0;
    162             result[i]=(char)(value + 48);
    163         }
    164 
    165         for(i = result.size() - 1; i >= 0; i--)
    166         {
    167             if(result[i] != '0')break;
    168         }
    169 
    170         result = result.substr(0, i+1);
    171 
    172         reverse(result.begin(), result.end());
    173         if(result.length()==0) result = "0";
    174         return result;
    175     }
    176 
    177 
    178     static string MULTIPLY(string number1, string number2)
    179     {
    180         int i, j;
    181         int *iresult;
    182         int length1 = number1.size();
    183         int length2 = number2.size();
    184         string result = "";
    185 
    186         reverse(number1.begin(), number1.end());
    187         reverse(number2.begin(), number2.end());
    188 
    189         iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
    190         memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));
    191 
    192         for(i = 0; i < length1; i++)
    193         {
    194             for(j = 0; j < length2; j++)
    195             {
    196                 iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
    197             }
    198         }
    199 
    200         int carry = 0;
    201         for(i = 0; i < length1 + length2; i++)
    202         {
    203             int value = iresult[i] + carry;
    204             iresult[i] = value % 10;
    205             carry = value / 10;
    206         }
    207    
    208         for(i = length1 + length2 - 1; i >= 0; i--)
    209         {
    210             if(iresult[i] != 0)break;
    211         }
    212 
    213         for(; i >= 0; i--)
    214         {
    215             result = result + (char)(iresult[i]+48);
    216         }
    217 
    218         free(iresult);
    219 
    220         if(result == "") result = "0";
    221         return result;
    222     }
    223 
    224 
    225     // 缺省地,商数向下取整, floatpoint用于指定保留小数点的位数
    226     static string DIVIDE(string number1, string number2, int floatpoint = 0)
    227     {
    228         int i, j, pos;
    229         string result = "";
    230         string tempstr = "";
    231         int length1 = number1.size();
    232         int length2 = number2.size();
    233 
    234         if((COMPARE(number2, number1) > 0) && (floatpoint == 0))
    235         {
    236             return "0";
    237         }
    238 
    239         tempstr = number1.substr(0, length2);
    240         pos = length2 - 1;
    241    
    242         while(pos < length1)
    243         {
    244             int quotient = 0;
    245             while(COMPARE(tempstr, number2) >= 0)
    246             {
    247                 quotient++;
    248                 tempstr = MINUS(tempstr, number2);
    249             }
    250        
    251             result = result + (char)(quotient + 48);
    252             pos++;
    253             if(pos < length1)
    254             {
    255                 tempstr += number1[pos];
    256             }
    257         }
    258 
    259         if(floatpoint > 0)
    260         {
    261             result += '.';
    262             string stmp = "1";
    263             int itmp = 0;
    264             for(int k = 0; k < floatpoint; ++k)
    265             {
    266                 stmp += '0';
    267                 if(COMPARE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2) < 0)
    268                 {
    269                     result += '0';
    270                     ++itmp;
    271                 }
    272             }
    273 
    274             string temp = DIVIDE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2);
    275             if(temp[0] != '0') result += temp;
    276         }
    277 
    278         j = result.size();
    279         for(i = 0; i < j; i++) 
    280         {
    281             if(result[i] != '0') break;
    282         }
    283 
    284         result = result.substr(i, j);
    285 
    286         return result;
    287     }
    288 
    289     static string MOD(string number1, string number2)
    290     {
    291         if(COMPARE(number2, number1) > 0)
    292         {
    293             return number1;
    294         }
    295         else if(COMPARE(number2, number1) == 0)
    296         {
    297             return "0";
    298         }
    299         else
    300         {
    301             return MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2));
    302         }
    303     }
    304 };
    305 
    306 int main(int argc, char* argv[])
    307 {
    308     string str1 = "9999999999999999999999999999999999999999";
    309     string str2 = "9998999899989998999899989998999899989998";
    310 
    311     cout << BIGINTEGEROPERATIONS::PLUS(str1, str2) << endl;
    312     cout << "===============" << endl;
    313     cout << BIGINTEGEROPERATIONS::MINUS(str1, str2) << endl;
    314     cout << "===============" << endl;
    315     cout << BIGINTEGEROPERATIONS::MULTIPLY(str1, str2) << endl;
    316     cout << "===============" << endl;
    317     cout << BIGINTEGEROPERATIONS::DIVIDE(str1, str2, 4) << endl;
    318     cout << "===============" << endl;
    319     cout << BIGINTEGEROPERATIONS::MOD(str1, str2) << endl;
    320 
    321     return 0;
    322 }
  • 相关阅读:
    docker 容器卷及提交
    docker 容器命令及解析
    docker镜像常用命令及解析
    drf 中集成swgger api功能文档
    drf 二次封装Response
    drf 中 自定义 异常处理方法
    drf 中自定义登录 以及token验证
    drf_vue对接极验验证
    django 信号的使用
    element plut tree renderContent
  • 原文地址:https://www.cnblogs.com/frankwin608/p/3619516.html
Copyright © 2011-2022 走看看