zoukankan      html  css  js  c++  java
  • 高精度模板

      1 //http://www.cnblogs.com/HarryGuo2012/p/4524041.html
      2 
      3 
      4 #include<string>
      5 #include<iostream>
      6 #include<iosfwd>
      7 #include<cmath>
      8 #include<cstring>
      9 #include<stdlib.h>
     10 #include<stdio.h>
     11 #include<cstring>
     12 #define MAX_L 2005 //最大长度,可以修改
     13 using namespace std;
     14 
     15 class bign
     16 {
     17 public:
     18     int len, s[MAX_L];//数的长度,记录数组
     19 //构造函数
     20     bign();
     21     bign(const char*);
     22     bign(int);
     23     bool sign;//符号 1正数 0负数
     24     string toStr() const;//转化为字符串,主要是便于输出
     25     friend istream& operator>>(istream &,bign &);//重载输入流
     26     friend ostream& operator<<(ostream &,bign &);//重载输出流
     27 //重载复制
     28     bign operator=(const char*);
     29     bign operator=(int);
     30     bign operator=(const string);
     31 //重载各种比较
     32     bool operator>(const bign &) const;
     33     bool operator>=(const bign &) const;
     34     bool operator<(const bign &) const;
     35     bool operator<=(const bign &) const;
     36     bool operator==(const bign &) const;
     37     bool operator!=(const bign &) const;
     38 //重载四则运算
     39     bign operator+(const bign &) const;
     40     bign operator++();
     41     bign operator++(int);
     42     bign operator+=(const bign&);
     43     bign operator-(const bign &) const;
     44     bign operator--();
     45     bign operator--(int);
     46     bign operator-=(const bign&);
     47     bign operator*(const bign &)const;
     48     bign operator*(const int num)const;
     49     bign operator*=(const bign&);
     50     bign operator/(const bign&)const;
     51     bign operator/=(const bign&);
     52 //四则运算的衍生运算
     53     bign operator%(const bign&)const;//取模(余数)
     54     bign factorial()const;//阶乘
     55     bign Sqrt()const;//整数开根(向下取整)
     56     bign pow(const bign&)const;//次方
     57 //一些乱乱的函数
     58     void clean();
     59     ~bign();
     60 };
     61 #define max(a,b) a>b ? a : b
     62 #define min(a,b) a<b ? a : b
     63 
     64 bign::bign()
     65 {
     66     memset(s, 0, sizeof(s));
     67     len = 1;
     68     sign = 1;
     69 }
     70 
     71 bign::bign(const char *num)
     72 {
     73     *this = num;
     74 }
     75 
     76 bign::bign(int num)
     77 {
     78     *this = num;
     79 }
     80 
     81 string bign::toStr() const
     82 {
     83     string res;
     84     res = "";
     85     for (int i = 0; i < len; i++)
     86         res = (char)(s[i] + '0') + res;
     87     if (res == "")
     88         res = "0";
     89     if (!sign&&res != "0")
     90         res = "-" + res;
     91     return res;
     92 }
     93 
     94 istream &operator>>(istream &in, bign &num)
     95 {
     96     string str;
     97     in>>str;
     98     num=str;
     99     return in;
    100 }
    101 
    102 ostream &operator<<(ostream &out, bign &num)
    103 {
    104     out<<num.toStr();
    105     return out;
    106 }
    107 
    108 bign bign::operator=(const char *num)
    109 {
    110     memset(s, 0, sizeof(s));
    111     char a[MAX_L] = "";
    112     if (num[0] != '-')
    113         strcpy(a, num);
    114     else
    115         for (int i = 1; i < strlen(num); i++)
    116             a[i - 1] = num[i];
    117     sign = !(num[0] == '-');
    118     len = strlen(a);
    119     for (int i = 0; i < strlen(a); i++)
    120         s[i] = a[len - i - 1] - 48;
    121     return *this;
    122 }
    123 
    124 bign bign::operator=(int num)
    125 {
    126     char temp[MAX_L];
    127     sprintf(temp, "%d", num);
    128     *this = temp;
    129     return *this;
    130 }
    131 
    132 bign bign::operator=(const string num)
    133 {
    134     const char *tmp;
    135     tmp = num.c_str();
    136     *this = tmp;
    137     return *this;
    138 }
    139 
    140 bool bign::operator<(const bign &num) const
    141 {
    142     if (sign^num.sign)
    143         return num.sign;
    144     if (len != num.len)
    145         return len < num.len;
    146     for (int i = len - 1; i >= 0; i--)
    147         if (s[i] != num.s[i])
    148             return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i]));
    149     return !sign;
    150 }
    151 
    152 bool bign::operator>(const bign&num)const
    153 {
    154     return num < *this;
    155 }
    156 
    157 bool bign::operator<=(const bign&num)const
    158 {
    159     return !(*this>num);
    160 }
    161 
    162 bool bign::operator>=(const bign&num)const
    163 {
    164     return !(*this<num);
    165 }
    166 
    167 bool bign::operator!=(const bign&num)const
    168 {
    169     return *this > num || *this < num;
    170 }
    171 
    172 bool bign::operator==(const bign&num)const
    173 {
    174     return !(num != *this);
    175 }
    176 
    177 bign bign::operator+(const bign &num) const
    178 {
    179     if (sign^num.sign)
    180     {
    181         bign tmp = sign ? num : *this;
    182         tmp.sign = 1;
    183         return sign ? *this - tmp : num - tmp;
    184     }
    185     bign result;
    186     result.len = 0;
    187     int temp = 0;
    188     for (int i = 0; temp || i < (max(len, num.len)); i++)
    189     {
    190         int t = s[i] + num.s[i] + temp;
    191         result.s[result.len++] = t % 10;
    192         temp = t / 10;
    193     }
    194     result.sign = sign;
    195     return result;
    196 }
    197 
    198 bign bign::operator++()
    199 {
    200     *this = *this + 1;
    201     return *this;
    202 }
    203 
    204 bign bign::operator++(int)
    205 {
    206     bign old = *this;
    207     ++(*this);
    208     return old;
    209 }
    210 
    211 bign bign::operator+=(const bign &num)
    212 {
    213     *this = *this + num;
    214     return *this;
    215 }
    216 
    217 bign bign::operator-(const bign &num) const
    218 {
    219     bign b=num,a=*this;
    220     if (!num.sign && !sign)
    221     {
    222         b.sign=1;
    223         a.sign=1;
    224         return b-a;
    225     }
    226     if (!b.sign)
    227     {
    228         b.sign=1;
    229         return a+b;
    230     }
    231     if (!a.sign)
    232     {
    233         a.sign=1;
    234         b=bign(0)-(a+b);
    235         return b;
    236     }
    237     if (a<b)
    238     {
    239         bign c=(b-a);
    240         c.sign=false;
    241         return c;
    242     }
    243     bign result;
    244     result.len = 0;
    245     for (int i = 0, g = 0; i < a.len; i++)
    246     {
    247         int x = a.s[i] - g;
    248         if (i < b.len) x -= b.s[i];
    249         if (x >= 0) g = 0;
    250         else
    251         {
    252             g = 1;
    253             x += 10;
    254         }
    255         result.s[result.len++] = x;
    256     }
    257     result.clean();
    258     return result;
    259 }
    260 
    261 bign bign::operator * (const bign &num)const
    262 {
    263     bign result;
    264     result.len = len + num.len;
    265 
    266     for (int i = 0; i < len; i++)
    267         for (int j = 0; j < num.len; j++)
    268             result.s[i + j] += s[i] * num.s[j];
    269 
    270     for (int i = 0; i < result.len; i++)
    271     {
    272         result.s[i + 1] += result.s[i] / 10;
    273         result.s[i] %= 10;
    274     }
    275     result.clean();
    276     result.sign = !(sign^num.sign);
    277     return result;
    278 }
    279 
    280 bign bign::operator*(const int num)const
    281 {
    282     bign x = num;
    283     bign z = *this;
    284     return x*z;
    285 }
    286 bign bign::operator*=(const bign&num)
    287 {
    288     *this = *this * num;
    289     return *this;
    290 }
    291 
    292 bign bign::operator /(const bign&num)const
    293 {
    294     bign ans;
    295     ans.len = len - num.len + 1;
    296     if (ans.len < 0)
    297     {
    298         ans.len = 1;
    299         return ans;
    300     }
    301 
    302     bign divisor = *this, divid = num;
    303     divisor.sign = divid.sign = 1;
    304     int k = ans.len - 1;
    305     int j = len - 1;
    306     while (k >= 0)
    307     {
    308         while (divisor.s[j] == 0) j--;
    309         if (k > j) k = j;
    310         char z[MAX_L];
    311         memset(z, 0, sizeof(z));
    312         for (int i = j; i >= k; i--)
    313             z[j - i] = divisor.s[i] + '0';
    314         bign dividend = z;
    315         if (dividend < divid) { k--; continue; }
    316         int key = 0;
    317         while (divid*key <= dividend) key++;
    318         key--;
    319         ans.s[k] = key;
    320         bign temp = divid*key;
    321         for (int i = 0; i < k; i++)
    322             temp = temp * 10;
    323         divisor = divisor - temp;
    324         k--;
    325     }
    326     ans.clean();
    327     ans.sign = !(sign^num.sign);
    328     return ans;
    329 }
    330 
    331 bign bign::operator/=(const bign&num)
    332 {
    333     *this = *this / num;
    334     return *this;
    335 }
    336 
    337 bign bign::operator%(const bign& num)const
    338 {
    339     bign a = *this, b = num;
    340     a.sign = b.sign = 1;
    341     bign result, temp = a / b*b;
    342     result = a - temp;
    343     result.sign = sign;
    344     return result;
    345 }
    346 
    347 bign bign::pow(const bign& num)const
    348 {
    349     bign result = 1;
    350     for (bign i = 0; i < num; i++)
    351         result = result*(*this);
    352     return result;
    353 }
    354 
    355 bign bign::factorial()const
    356 {
    357     bign result = 1;
    358     for (bign i = 1; i <= *this; i++)
    359         result *= i;
    360     return result;
    361 }
    362 
    363 void bign::clean()
    364 {
    365     if (len == 0) len++;
    366     while (len > 1 && s[len - 1] == '')
    367         len--;
    368 }
    369 
    370 bign bign::Sqrt()const
    371 {
    372     if(*this<0)return -1;
    373     if(*this<=1)return *this;
    374     bign l=0,r=*this,mid;
    375     while(r-l>1)
    376     {
    377         mid=(l+r)/2;
    378         if(mid*mid>*this)
    379             r=mid;
    380         else
    381             l=mid;
    382     }
    383     return l;
    384 }
    385 
    386 bign::~bign()
    387 {
    388 }
    389 
    390 bign num0,num1,res;
    391 
    392 int main() {
    393     num0 = 1, num1 = 2;
    394     res=num0-num1;
    395     cout << res << endl;
    396     return 0;
    397 }
  • 相关阅读:
    2019年10月24日打印个人信息清单
    vsftp安装
    网络连接
    mysql多种方法修改密码----5.6的坑
    openstack-L版安装
    openstack是什么
    kvm快照
    文件操作
    函数
    virt-manage图形界面键盘错位问题
  • 原文地址:https://www.cnblogs.com/zxhl/p/4984923.html
Copyright © 2011-2022 走看看