zoukankan      html  css  js  c++  java
  • C++ BigInteger模板

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <string>
      4 #include <iostream>
      5 #include <iomanip>
      6 #include <algorithm>
      7 using namespace std;
      8 
      9 #define MAXN 9999
     10 #define MAXSIZE 10
     11 #define DLEN 4
     12 const long long MOD = 258280327;
     13 class BigInteger
     14 {
     15 private:
     16     int a[3000];    //可以控制大数的位数
     17     int len;       //大数长度
     18 public:
     19     BigInteger(){ len = 1; memset(a, 0, sizeof(a)); }   //构造函数
     20     BigInteger(const int);       //将一个int类型的变量转化为大数
     21     BigInteger(const char*);     //将一个字符串类型的变量转化为大数
     22     BigInteger(const BigInteger &);  //拷贝构造函数
     23     BigInteger &operator=(const BigInteger &);   //重载赋值运算符,大数之间进行赋值运算
     24 
     25     friend istream& operator>>(istream&, BigInteger&);   //重载输入运算符
     26     friend ostream& operator<<(ostream&, BigInteger&);   //重载输出运算符
     27 
     28     BigInteger operator+(const BigInteger &) const;   //重载加法运算符,两个大数之间的相加运算
     29     BigInteger operator-(const BigInteger &) const;   //重载减法运算符,两个大数之间的相减运算
     30     BigInteger operator*(const BigInteger &) const;   //重载乘法运算符,两个大数之间的相乘运算
     31     BigInteger operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
     32 
     33     BigInteger operator^(const int  &) const;    //大数的n次方运算
     34     long long    operator%(const long long  &) const;    //大数对一个int类型的变量进行取模运算
     35     bool   operator>(const BigInteger & T)const;   //大数和另一个大数的大小比较
     36     bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
     37 
     38     void print();       //输出大数
     39 };
     40 BigInteger::BigInteger(const int b)     //将一个int类型的变量转化为大数
     41 {
     42     int c, d = b;
     43     len = 0;
     44     memset(a, 0, sizeof(a));
     45     while (d > MAXN)
     46     {
     47         c = d - (d / (MAXN + 1)) * (MAXN + 1);
     48         d = d / (MAXN + 1);
     49         a[len++] = c;
     50     }
     51     a[len++] = d;
     52 }
     53 BigInteger::BigInteger(const char*s)     //将一个字符串类型的变量转化为大数
     54 {
     55     int t, k, index, l, i;
     56     memset(a, 0, sizeof(a));
     57     l = strlen(s);
     58     len = l / DLEN;
     59     if (l%DLEN)
     60         len++;
     61     index = 0;
     62     for (i = l - 1; i >= 0; i -= DLEN)
     63     {
     64         t = 0;
     65         k = i - DLEN + 1;
     66         if (k<0)
     67             k = 0;
     68         for (int j = k; j <= i; j++)
     69             t = t * 10 + s[j] - '0';
     70         a[index++] = t;
     71     }
     72 }
     73 BigInteger::BigInteger(const BigInteger & T) : len(T.len)  //拷贝构造函数
     74 {
     75     int i;
     76     memset(a, 0, sizeof(a));
     77     for (i = 0; i < len; i++)
     78         a[i] = T.a[i];
     79 }
     80 BigInteger & BigInteger::operator=(const BigInteger & n)   //重载赋值运算符,大数之间进行赋值运算
     81 {
     82     int i;
     83     len = n.len;
     84     memset(a, 0, sizeof(a));
     85     for (i = 0; i < len; i++)
     86         a[i] = n.a[i];
     87     return *this;
     88 }
     89 istream& operator>>(istream & in, BigInteger & b)   //重载输入运算符
     90 {
     91     char ch[MAXSIZE * 4];
     92     int i = -1;
     93     in >> ch;
     94     int l = strlen(ch);
     95     int count = 0, sum = 0;
     96     for (i = l - 1; i >= 0;)
     97     {
     98         sum = 0;
     99         int t = 1;
    100         for (int j = 0; j<4 && i >= 0; j++, i--, t *= 10)
    101         {
    102             sum += (ch[i] - '0')*t;
    103         }
    104         b.a[count] = sum;
    105         count++;
    106     }
    107     b.len = count++;
    108     return in;
    109 
    110 }
    111 ostream& operator<<(ostream& out, BigInteger& b)   //重载输出运算符
    112 {
    113     int i;
    114     cout << b.a[b.len - 1];
    115     for (i = b.len - 2; i >= 0; i--)
    116     {
    117         cout.width(DLEN);
    118         cout.fill('0');
    119         cout << b.a[i];
    120     }
    121     return out;
    122 }
    123 
    124 BigInteger BigInteger::operator+(const BigInteger & T) const   //两个大数之间的相加运算
    125 {
    126     BigInteger t(*this);
    127     int i, big;      //位数
    128     big = T.len > len ? T.len : len;
    129     for (i = 0; i < big; i++)
    130     {
    131         t.a[i] += T.a[i];
    132         if (t.a[i] > MAXN)
    133         {
    134             t.a[i + 1]++;
    135             t.a[i] -= MAXN + 1;
    136         }
    137     }
    138     if (t.a[big] != 0)
    139         t.len = big + 1;
    140     else
    141         t.len = big;
    142     return t;
    143 }
    144 BigInteger BigInteger::operator-(const BigInteger & T) const   //两个大数之间的相减运算
    145 {
    146     int i, j, big;
    147     bool flag;
    148     BigInteger t1, t2;
    149     if (*this>T)
    150     {
    151         t1 = *this;
    152         t2 = T;
    153         flag = 0;
    154     }
    155     else
    156     {
    157         t1 = T;
    158         t2 = *this;
    159         flag = 1;
    160     }
    161     big = t1.len;
    162     for (i = 0; i < big; i++)
    163     {
    164         if (t1.a[i] < t2.a[i])
    165         {
    166             j = i + 1;
    167             while (t1.a[j] == 0)
    168                 j++;
    169             t1.a[j--]--;
    170             while (j > i)
    171                 t1.a[j--] += MAXN;
    172             t1.a[i] += MAXN + 1 - t2.a[i];
    173         }
    174         else
    175             t1.a[i] -= t2.a[i];
    176     }
    177     t1.len = big;
    178     while (t1.a[t1.len - 1] == 0 && t1.len > 1)
    179     {
    180         t1.len--;
    181         big--;
    182     }
    183     if (flag)
    184         t1.a[big - 1] = 0 - t1.a[big - 1];
    185     return t1;
    186 }
    187 
    188 BigInteger BigInteger::operator*(const BigInteger & T) const   //两个大数之间的相乘运算
    189 {
    190     BigInteger ret;
    191     int i, j, up;
    192     int temp, temp1;
    193     for (i = 0; i < len; i++)
    194     {
    195         up = 0;
    196         for (j = 0; j < T.len; j++)
    197         {
    198             temp = a[i] * T.a[j] + ret.a[i + j] + up;
    199             if (temp > MAXN)
    200             {
    201                 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
    202                 up = temp / (MAXN + 1);
    203                 ret.a[i + j] = temp1;
    204             }
    205             else
    206             {
    207                 up = 0;
    208                 ret.a[i + j] = temp;
    209             }
    210         }
    211         if (up != 0)
    212             ret.a[i + j] = up;
    213     }
    214     ret.len = i + j;
    215     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
    216         ret.len--;
    217     return ret;
    218 }
    219 BigInteger BigInteger::operator/(const int & b) const   //大数对一个整数进行相除运算
    220 {
    221     BigInteger ret;
    222     int i, down = 0;
    223     for (i = len - 1; i >= 0; i--)
    224     {
    225         ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
    226         down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
    227     }
    228     ret.len = len;
    229     while (ret.a[ret.len - 1] == 0 && ret.len > 1)
    230         ret.len--;
    231     return ret;
    232 }
    233 long long BigInteger::operator %(const long long & b) const    //大数对一个int类型的变量进行取模运算
    234 {
    235     int i;
    236     long long d = 0;
    237     for (i = len - 1; i >= 0; i--)
    238     {
    239         d = ((d * (MAXN + 1)) % b + (long long)(a[i])) % b;
    240     }
    241     return d;
    242 }
    243 BigInteger BigInteger::operator^(const int & n) const    //大数的n次方运算
    244 {
    245     BigInteger t, ret(1);
    246     int i;
    247     if (n<0)
    248         exit(-1);
    249     if (n == 0)
    250         return 1;
    251     if (n == 1)
    252         return *this;
    253     int m = n;
    254     while (m>1)
    255     {
    256         t = *this;
    257         for (i = 1; i << 1 <= m; i <<= 1)
    258         {
    259             t = t*t;
    260         }
    261         m -= i;
    262         ret = ret*t;
    263         if (m == 1)
    264             ret = ret*(*this);
    265     }
    266     return ret;
    267 }
    268 bool BigInteger::operator>(const BigInteger & T) const   //大数和另一个大数的大小比较
    269 {
    270     int ln;
    271     if (len > T.len)
    272         return true;
    273     else if (len == T.len)
    274     {
    275         ln = len - 1;
    276         while (a[ln] == T.a[ln] && ln >= 0)
    277             ln--;
    278         if (ln >= 0 && a[ln] > T.a[ln])
    279             return true;
    280         else
    281             return false;
    282     }
    283     else
    284         return false;
    285 }
    286 bool BigInteger::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    287 {
    288     BigInteger b(t);
    289     return *this>b;
    290 }
    291 
    292 void BigInteger::print()    //输出大数
    293 {
    294     int i;
    295     cout << a[len - 1];
    296     for (i = len - 2; i >= 0; i--)
    297     {
    298         cout.width(DLEN);
    299         cout.fill('0');
    300         cout << a[i];
    301     }
    302     cout << endl;
    303 }

     其实这个也没多大用,大数肯定直接用Java了

  • 相关阅读:
    Oracle 11g+Windows10 x64安装、配置过程记录
    json工具类
    restTemplate工具类
    VirtualBox中安装CentOS 7后无法上网问题
    VirtualBox中安装CentOS 7
    idea安装完成后要做的几件事(设置字体、编码、行号)
    MiniUI学习笔记1-新手必读
    BUU-[GKCTF2020]WannaReverse
    BUU-Dragon Quest
    BUU-EzObfus-Chapter2
  • 原文地址:https://www.cnblogs.com/macinchang/p/4702378.html
Copyright © 2011-2022 走看看