zoukankan      html  css  js  c++  java
  • 退役选手ZlycerQan的强大的的高精度

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <vector>
      4 #include <iomanip>
      5 #include <cassert>
      6 #include <algorithm>
      7 #include <cstring>
      8 
      9 const int Big_B = 1000000000;
     10 const int Big_L = 9;
     11 inline int intcmp_ (int a, int b) {
     12     if (a > b) return 1;
     13     return a < b ? -1 : 0;
     14 }
     15 struct Int {
     16 #define rg register
     17     inline int max (int a, int b) {
     18         return a > b ? a : b;
     19     }
     20     inline int min (int a, int b) {
     21         return a < b ? a : b;
     22     }
     23     std :: vector <int> c;
     24     Int () {} typedef long long LL;
     25     Int (int x) {
     26         for (; x > 0; c.push_back (x % Big_B), x /= Big_B);
     27     }
     28     Int (LL x) {
     29         for (; x > 0; c.push_back (x % Big_B), x /= Big_B);
     30     }
     31     inline void CrZ () {
     32         for (; !c.empty () && c.back () == 0; c.pop_back ());
     33     }
     34     inline Int &operator += (const Int &rhs) {
     35         c.resize (max (c.size (), rhs.c.size ()));
     36         rg int i, t = 0, S;
     37         for (i = 0, S = rhs.c.size (); i < S; ++ i)
     38             c[i] += rhs.c[i] + t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
     39         for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
     40             c[i] += t, t = c[i] >= Big_B, c[i] -= Big_B & (-t);
     41         if (t) c.push_back (t);
     42         return *this;
     43     }
     44     inline Int &operator -= (const Int &rhs) {
     45         c.resize (max (c.size (), rhs.c.size ()));
     46         rg int i, t = 0, S;
     47         for (i = 0, S = rhs.c.size (); i < S; ++ i)
     48             c[i] -= rhs.c[i] + t, t = c[i] < 0, c[i] += Big_B & (-t);
     49         for (i = rhs.c.size (), S = c.size (); t && i < S; ++ i)
     50             c[i] -= t, t = c[i] < 0, c[i] += Big_B & (-t);
     51         CrZ ();
     52         return *this;
     53     }
     54     inline Int &operator *= (const Int &rhs) {
     55         rg int na = c.size (), i, j, S, ai;
     56         c.resize (na + rhs.c.size ());
     57         LL t;
     58         for (i = na - 1; i >= 0; -- i) {
     59             ai = c[i], t = 0, c[i] = 0;
     60             for (j = 0, S = rhs.c.size (); j < S; ++ j) {
     61                 t += c[i + j] + (LL) ai * rhs.c[j];
     62                 c[i + j] = t % Big_B, t /= Big_B;
     63             }
     64             for (j = rhs.c.size (), S = c.size (); t != 0 && i + j < S; ++ j)
     65                 t += c[i + j], c[i + j] = t % Big_B, t /= Big_B;
     66             assert (t == 0);
     67         }
     68         CrZ ();
     69         return *this;
     70     }
     71     inline Int &operator /= (const Int &rhs) {
     72         return *this = div (rhs);
     73     }
     74     inline Int &operator %= (const Int &rhs) {
     75         return div (rhs), *this;
     76     }
     77     inline Int &shlb (int l = 1) {
     78         if (c.empty ()) return *this;
     79         c.resize (c.size () + l);
     80         rg int i;
     81         for (i = c.size () - 1; i >= l; -- i) c[i] = c[i - l];
     82         for (i = 0; i < l; ++ i) c[i] = 0;
     83         return *this;
     84     }
     85     inline Int &shrb (int l = 1) {
     86         for (rg int i = 0; i < c.size () - l; ++ i) c[i] = c[i + l];
     87         c.resize (max (c.size () - l, 0));
     88         return *this;
     89     }
     90     inline int Comp (const Int &rhs) const {
     91         if (c.size () != rhs.c.size ()) return intcmp_ (c.size (), rhs.c.size ());
     92         for (rg int i = c.size () - 1; i >= 0; -- i)
     93             if (c[i] != rhs.c[i]) return intcmp_ (c[i], rhs.c[i]);
     94         return 0;
     95     }
     96     inline Int div (const Int &rhs) {
     97         assert (!rhs.c.empty ());
     98         Int q, r;
     99         rg int i;
    100         if (rhs > *this) return 0;
    101         q.c.resize (c.size () - rhs.c.size () + 1);
    102         rg int _l, _r, mid;
    103         for (i = c.size () - 1; i > c.size () - rhs.c.size (); -- i) r.shlb (), r += c[i];
    104         for (i = c.size () - rhs.c.size (); i >= 0; -- i) {
    105             r.shlb ();
    106             r += c[i];
    107             if (r.Comp (rhs) < 0) q.c[i] = 0;
    108             else {
    109                 _l = 0, _r = Big_B;
    110                 for (; _l != _r; ) {
    111                     mid = _l + _r >> 1;
    112                     if ((rhs * mid).Comp (r) <= 0) _l = mid + 1;
    113                     else _r = mid;
    114                 }
    115                 q.c[i] = _l - 1, r -= rhs * q.c[i];
    116             }
    117         }
    118         q.CrZ (), *this = r;
    119         return q;
    120     }
    121     friend inline Int operator + (const Int &lhs, const Int &rhs) {
    122         Int res = lhs;
    123         return res += rhs;
    124     }
    125     friend inline Int operator - (const Int &lhs, const Int &rhs) {
    126         Int res = lhs;
    127         return res -= rhs;
    128     }
    129     friend inline Int operator * (const Int &lhs, const Int &rhs) {
    130         Int res = lhs;
    131         return res *= rhs;
    132     }
    133     friend inline Int operator / (const Int &lhs, const Int &rhs) {
    134         Int res = lhs;
    135         return res.div (rhs);
    136     }
    137     friend inline Int operator % (const Int &lhs, const Int &rhs) {
    138         Int res = lhs;
    139         return res.div (rhs), res;
    140     }
    141     friend inline std :: ostream &operator << (std :: ostream &out, const Int &rhs) {
    142         if (rhs.c.size () == 0) out << "0";
    143         else {
    144             out << rhs.c.back ();
    145             for (rg int i = rhs.c.size () - 2; i >= 0; -- i)
    146                 out << std :: setfill ('0') << std :: setw (Big_L) << rhs.c[i];
    147         }
    148         return out;
    149     }
    150     friend inline std :: istream &operator >> (std :: istream &in, Int &rhs) {
    151         static char s[10000];
    152         in >> s + 1;
    153         int Len = strlen (s + 1);
    154         int v = 0;
    155         LL r = 0, p = 1;
    156         for (rg int i = Len; i >= 1; -- i) {
    157             ++ v;
    158             r = r + (s[i] - '0') * p, p *= 10;
    159             if (v == Big_L) rhs.c.push_back (r), r = 0, v = 0, p = 1;
    160         }
    161         if (v != 0) rhs.c.push_back (r);
    162         return in;
    163     }
    164     friend inline bool operator < (const Int &lhs, const Int &rhs) {
    165         return lhs.Comp (rhs) < 0;
    166     }
    167     friend inline bool operator <= (const Int &lhs, const Int &rhs) {
    168         return lhs.Comp (rhs) <= 0;
    169     }
    170     friend inline bool operator > (const Int &lhs, const Int &rhs) {
    171         return lhs.Comp (rhs) > 0;
    172     }
    173     friend inline bool operator >= (const Int &lhs, const Int &rhs) {
    174         return lhs.Comp (rhs) >= 0;
    175     }
    176     friend inline bool operator == (const Int &lhs, const Int &rhs) {
    177         return lhs.Comp (rhs) == 0;
    178     }
    179     friend inline bool operator != (const Int &lhs, const Int &rhs) {
    180         return lhs.Comp (rhs) != 0;
    181     }
    182 #undef rg
    183 };
    184 Int a;
    185 int Main () {
    186     return 0;
    187 }
    188 int ZlycerQan = Main ();
    189 int main (int argc, char *argv[]) {
    190     ;
    191 }
  • 相关阅读:
    SQL SERVER 2005添加用户和编辑sa
    数组型参数和数组的区别
    Oracle数据库建库、建表空间,建用户
    oracle表空间操作详解
    Oracle10g的完全卸载(转载)
    Delphi format的用法
    AnImateWindow用法
    文本文件操作
    TStringList的用法
    Delphi网络函数
  • 原文地址:https://www.cnblogs.com/476974496xiaolang/p/9064592.html
Copyright © 2011-2022 走看看