zoukankan      html  css  js  c++  java
  • 大整数类(模板)

      1 /*支持加减乘除、取模、赋值、输入输出*/
      2 const int MAX_SIZE = 5000 + 10;  //最大位数
      3 
      4 struct BigInteger
      5 {
      6     int len, s[MAX_SIZE];
      7     BigInteger()
      8     {
      9         memset(s, 0, sizeof(s));
     10         len = 1;
     11     }
     12     BigInteger(int num) { *this = num; }
     13     BigInteger(const char *num) { *this = num; }
     14     void clean() { while (len > 1 && !s[len - 1])len--; }
     15     BigInteger operator = (const int num)
     16     {
     17         char s[MAX_SIZE];
     18         sprintf(s, "%d", num);
     19         *this = s;
     20         return *this;
     21     }
     22     BigInteger operator = (const char *num)
     23     {
     24         len = strlen(num);
     25         for (int i = 0; i < len; i++)s[i] = num[len - i - 1] - '0';
     26         return *this;
     27     }
     28     BigInteger operator + (const BigInteger& b)
     29     {
     30         BigInteger c;
     31         c.len = 0;
     32         for (int i = 0, g = 0; g || i < max(len, b.len); i++)
     33         {
     34             int x = g;
     35             if (i < b.len)x += b.s[i];
     36             if (i < len)x += s[i];
     37             c.s[c.len++] = x % 10;
     38             g = x / 10;
     39         }
     40         return c;
     41     }
     42     BigInteger operator - (const BigInteger& b)
     43     {
     44         BigInteger c;
     45         c.len = 0;
     46         for (int i = 0, g = 0; i < len; i++)
     47         {
     48             int x = s[i] - g;
     49             if (i < b.len)x -= b.s[i];
     50             if (x >= 0)g = 0;
     51             else { g = 1; x += 10; }
     52             c.s[c.len++] = x;
     53         }
     54         c.clean();
     55         return c;
     56     }
     57     BigInteger operator * (const BigInteger& b)
     58     {
     59         BigInteger c;
     60         c.len = len + b.len;
     61         for (int i = 0; i < len; i++)
     62         {
     63             for (int j = 0; j < b.len; j++)
     64             {
     65                 c.s[i + j] += s[i] * b.s[j];
     66             }
     67         }
     68         for (int i = 0; i < c.len; i++)
     69         {
     70             c.s[i + 1] += c.s[i] / 10;
     71             c.s[i] %= 10;
     72         }
     73         c.clean();
     74         return c;
     75     }
     76     BigInteger operator * (const int& b)
     77     {
     78         BigInteger c;
     79         c.len = 0;
     80         for (int i = 0, g = 0; g || i < len; i++)
     81         {
     82             int x;
     83             if (i < len)x = s[i] * b + g;
     84             else x = g;
     85             c.s[c.len++] = x % 10;
     86             g = x / 10;
     87         }
     88         return c;
     89     }
     90     BigInteger operator / (const BigInteger& b)
     91     {
     92         BigInteger c, f = 0;
     93         for (int i = len - 1; i >= 0; i--)
     94         {
     95             f = f * 10;
     96             f.s[0] = s[i];
     97             while (f >= b)
     98             {
     99                 f = f - b;
    100                 c.s[i]++;
    101             }
    102         }
    103         c.len = len;
    104         c.clean();
    105         return c;
    106     }
    107     BigInteger operator / (const int& b)
    108     {
    109         BigInteger c, d = *this;
    110         c.len = len;
    111         for (int i = len - 1, g = 0; i >= 0; i--)
    112         {
    113             d.s[i] += g * 10;
    114             c.s[i] = d.s[i] / b;
    115             g = d.s[i] % b;
    116         }
    117         c.clean();
    118         return c;
    119     }
    120     BigInteger operator % (const BigInteger& b)
    121     {
    122         BigInteger c = *this / b;
    123         c = *this - c * b;
    124         return c;
    125     }
    126     BigInteger operator += (const BigInteger& b)
    127     {
    128         *this = *this + b; return *this;
    129     }
    130     BigInteger operator -= (const BigInteger& b)
    131     {
    132         *this = *this - b; return *this;
    133     }
    134     BigInteger operator *= (const BigInteger& b)
    135     {
    136         *this = *this*b; return *this;
    137     }
    138     BigInteger operator /= (const BigInteger& b)
    139     {
    140         *this = *this / b; return *this;
    141     }
    142     BigInteger operator *= (const int& b)
    143     {
    144         *this = *this*b; return *this;
    145     }
    146     BigInteger operator /= (const int& b)
    147     {
    148         *this = *this / b; return *this;
    149     }
    150     BigInteger operator %= (const BigInteger& b)
    151     {
    152         *this = *this%b; return *this;
    153     }
    154     bool operator < (const BigInteger& b)
    155     {
    156         if (b.len != len)return len < b.len;
    157         for (int i = len - 1; i >= 0; i--)
    158         {
    159             if (s[i] != b.s[i])return s[i] < b.s[i];
    160         }
    161         return 0;
    162     }
    163     bool operator > (const BigInteger& b)
    164     {
    165         if (b.len != len)return len > b.len;
    166         for (int i = len - 1; i >= 0; i--)
    167         {
    168             if (s[i] != b.s[i])return s[i] > b.s[i];
    169         }
    170         return 0;
    171     }
    172     bool operator == (const BigInteger& b)
    173     {
    174         return !(*this > b) && !(*this < b);
    175     }
    176     bool operator <= (const BigInteger& b)
    177     {
    178         return !(*this > b);
    179     }
    180     bool operator >= (const BigInteger& b)
    181     {
    182         return !(*this < b);
    183     }
    184     bool operator != (const BigInteger& b)
    185     {
    186         return !(*this == b);
    187     }
    188     string str() const
    189     {
    190         string res;
    191         for (int i = 0; i < len; i++)
    192             res = char(s[i] + '0') + res;
    193         return res;
    194     }
    195 };
    196 istream& operator >> (istream&in, BigInteger &x)
    197 {
    198     string s;
    199     in >> s;
    200     x = s.c_str();
    201     return in;
    202 }
    203 ostream& operator << (ostream&out, BigInteger x)
    204 {
    205     out << x.str();
    206     return out;
    207 }
  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/lfri/p/9641593.html
Copyright © 2011-2022 走看看