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 }
  • 相关阅读:
    2021.1.28 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2021.1.23 个人rating赛补题报告
    2020.12.14 个人训练赛补题报告
    2020.11.28 2020团体程序设计天梯赛补题报告
    2020.12.3 Codeforces Beta Round #73(Div2)补题报告
    Xhorse VVDI Prog V5.0.6 is Ready for BCM2 Adapter
    Program 2021 Ford Bronco All Keys Lost using VVDI Key Tool Plus
    Xhorse VVDI Prog V5.0.4 Software Update in July 2021
    How to use Xhorse VVDI2 to Exchange BMW FEM/BDC Module?
  • 原文地址:https://www.cnblogs.com/frankwin608/p/3619516.html
Copyright © 2011-2022 走看看