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

    我肝了好多天啊!!!!

    终于把高精的模板搞出来了!!!

    这个高精是直接用结构体封装的,然后可以很方便的直接声明高精变量,然后就可以像普通的高精一样使用了

    现有如下三个版本

    Code1:

    不支持负数

      1 struct HP {
      2     int p[25555], len;//array max are 25555
      3     bool flag;
      4     HP () {
      5         memset(p, 0, sizeof p);
      6         len = 1, flag = false;
      7     }
      8     void in() {
      9         len = 0;
     10         char c = getchar();
     11         while (c < '0' || c > '9'){if (c == '-') flag ^= 1; c = getchar();}
     12         while ('0' <= c && c <= '9') {p[++len] = c - '0'; c = getchar();}
     13         for (int l = 1, r = len; l < r;) {
     14             swap(p[l++], p[r--]);
     15         }
     16     }
     17     void make(int x) {
     18         memset(p, 0, sizeof p);
     19         len = 0;
     20         while (x) {
     21             p[++len] = x;
     22             x /= 10;
     23         }
     24     }
     25     void print() {
     26         if (flag == true) printf("-");
     27         for (int i = len; i >= 1; i--) {
     28             printf("%d", p[i]);
     29         }
     30     }
     31     bool operator < (const HP &b) const {
     32         if(len != b.len) return len < b.len;
     33         for (int i = len; i >= 1; i--) {
     34             if(p[i] != b.p[i]) return p[i] < b.p[i];
     35         }
     36         return false;
     37     }
     38     bool operator > (const HP &b) const {
     39         if(len != b.len) return len > b.len;
     40         for (int i = len; i >= 1; i--) {
     41             if(p[i] != b.p[i]) return p[i] > b.p[i];
     42         }
     43         return false;
     44     }
     45     bool operator <= (const HP &b) const {
     46         if (len != b.len) return len < b.len;
     47         for (int i = len; i >= 1; i--) {
     48             if (p[i] != b.p[i]) return p[i] < b.p[i];
     49         }
     50         return true;
     51     }
     52     bool operator >= (const HP &b) const {
     53         if (len != b.len) return len > b.len;
     54         for (int i = len; i >= 1; i--) {
     55             if (p[i] != b.p[i]) return p[i] > b.p[i];
     56         }
     57         return true;
     58     }
     59     bool operator == (const HP &b) const {
     60         if (len != b.len) return false;
     61         for (int i = len; i >= 1; i--) {
     62             if (p[i] != b.p[i]) return false;
     63         }
     64         return true;
     65     }
     66     bool operator != (const HP &b) const {
     67         if (len != b.len) return true;
     68         for (int i = len; i >= 1; i--) {
     69             if (p[i] != b.p[i]) return true;
     70         }
     71         return false;
     72     }
     73     HP operator + (const HP &b) const {//high + high
     74         HP c;
     75         c.len = max(len, b.len);
     76         int re = 0;
     77         for (int i = 1; i <= c.len; i++) {
     78             re += p[i] + b.p[i];
     79             c.p[i] = re % 10;
     80             re /= 10;
     81         }
     82         while (re) {
     83             c.p[++c.len] = re % 10;
     84             re /= 10;
     85         }
     86         return c;
     87     }
     88     HP operator - (const HP &B) const {//high - high
     89         HP a = (*this), b = B, c;
     90         if (a < b) {c.flag = true; swap(a, b);}
     91         c.len = a.len;
     92         int re = 0;
     93         for (int i = 1; i <= c.len; i++) {
     94             re += a.p[i] - b.p[i];
     95             if (re < 0) {
     96                 c.p[i] = re + 10;
     97                 re = -1;
     98             } else {
     99                 c.p[i] = re;
    100                 re = 0;
    101             }
    102         }
    103         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    104         return c;
    105     }
    106     HP operator * (const int &B) const {//high * low
    107         if (B == 1) return (*this);
    108         int b = B;
    109         HP c;
    110         c.len = len;
    111         int re = 0;
    112         for (int i = 1; i <= len; i++) {
    113             re += p[i] * b;
    114             c.p[i] = re % 10;
    115             re /= 10;
    116         }
    117         while (re) {
    118             c.p[++c.len] = re % 10;
    119             re /= 10;
    120         }
    121         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    122         return c;
    123     }
    124     HP operator * (const HP &b) const {//high * high
    125         if (b.len == 1 && b.p[1] == 1) return (*this);
    126         if (len == 1 && p[1] == 1) return b;
    127         HP c;
    128         c.len = len + b.len;
    129         for (int i = 1; i <= len; i++) {
    130             int re = 0;
    131             for (int j = 1; j <= b.len; j++) {
    132                 c.p[i + j - 1] += p[i] * b.p[j] + re;
    133                 re = c.p[i + j - 1] / 10;
    134                 c.p[i + j - 1] %= 10;
    135             }
    136             c.p[i + b.len] = re;
    137         }
    138         while (c.p[c.len] > 0) c.len++;
    139         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    140         return c;
    141     }
    142     HP operator / (const int &b) const {//high / low
    143         if (b == 1) return (*this);
    144         HP c;
    145         c.len = len;
    146         int re = 0;
    147         for (int i = len; i >= 1; i--) {
    148             re = re * 10 + p[i];
    149             c.p[i] = re / b;
    150             re %= b;
    151         }
    152         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    153         return c;
    154     }
    155     bool div_cmp(const HP& b) {//a compoent of high / high
    156         if (len < b.len) return true;
    157         for (int i = 0; i < b.len; i++) {
    158             if (p[len - i] != b.p[b.len - i]) {
    159                 return p[len - i] < b.p[b.len - i];
    160             }
    161         }
    162         return false;
    163     }
    164     HP div_mul(int t) {//a compoent of high / high
    165         if (!t) return (*this);
    166         HP c;
    167         c.len = len + t;
    168         for (int i = 1; i <= len; i++) {
    169             c.p[i + t] = p[i];
    170         }
    171         return c;
    172     }
    173     HP operator / (HP b) const {//high / high
    174         if (b.len == 1 && b.p[1] == 1) return (*this);
    175         if ((*this) < b) {
    176             HP c;
    177             c.len = 1, c.p[1] = 0;
    178             return c;
    179         }
    180         HP a = (*this), c, tmp;
    181         c.len = -1;
    182         int l, t;
    183         while (true) {
    184             l = a.len - b.len - a.div_cmp(b);
    185             if (l < 0) break;
    186             tmp = b.div_mul(l);
    187             t = 0;
    188             while (tmp <= a) {
    189                 a = a - tmp;
    190                 t++;
    191             }
    192             if (c.len == -1 && t) {
    193                 c.len = l + 1;
    194             }
    195             c.p[l + 1] = t;
    196         }
    197         return c;
    198     }
    199     HP operator % (const int b) const {//high % low
    200         HP d = (*this), c = (*this) / b;
    201         c = c * b;
    202         HP e = d - c;
    203         return e;
    204     }
    205     HP operator % (const HP &b) const {//high % high
    206         HP d = (*this), c = (*this) / b;
    207         c = c * b;
    208         HP e = d - c;
    209         return e;
    210     }
    211 };
    212 HP pw(HP x, HP y) {
    213     HP re = e1;//need to declare a variable as 1
    214     for (; y > e0; y = y / 2) {
    215         if (y % 2 == e1) {
    216             re = re * x;
    217         }
    218         x = x * x;
    219     }
    220     return re;
    221 }
    222 HP Max(const HP &a, const HP &b) {
    223     if (a.len > b.len) {
    224         return a;
    225     } else if (a.len < b.len) {
    226         return b;
    227     }
    228     for (int i = a.len; i >= 1; i--) {
    229         if (a.p[i] > b.p[i]) {
    230             return a;
    231         } else if (a.p[i] < b.p[i]) {
    232             return b;
    233         }
    234     }
    235     return a;
    236 }
    237 HP Min(const HP &a, const HP &b) {
    238     if (a.len > b.len) {
    239         return b;
    240     } else if (a.len < b.len) {
    241         return a;
    242     }
    243     for (int i = a.len; i >= 1; i--) {
    244         if (a.p[i] < b.p[i]) {
    245             return a;
    246         } else if (a.p[i] > b.p[i]) {
    247             return b;
    248         }
    249     }
    250     return a;
    251 }
    View Code

    Code2:

    支持负数

      1 struct HP {
      2     int p[25555], len;//看题目开数组,最大就25555 
      3     bool flag;
      4     HP () {
      5         memset(p, 0, sizeof p);
      6         len = 0, flag = false;
      7     }
      8     void in() {
      9         char c = getchar();
     10         while (c < '0' || c > '9'){if (c == '-') flag ^= 1; c = getchar();}
     11         while ('0' <= c && c <= '9') {p[++len] = c - '0'; c = getchar();}
     12         for (int l = 1, r = len; l < r;) {
     13             swap(p[l++], p[r--]);
     14         }
     15     }
     16     void print() {
     17         if (flag == true) printf("-");
     18         for (int i = len; i >= 1; i--) {
     19             printf("%d", p[i]);
     20         }
     21     }
     22     bool operator < (const HP &b) const {//高精之间的比较 支持负数 
     23         if (flag && !b.flag) return true;
     24         if (!flag && b.flag) return false;
     25         if (flag && b.flag) {
     26             if(len != b.len) return len > b.len;
     27             for (int i = len; i >= 1; i--) {
     28                 if(p[i] != b.p[i]) return p[i] > b.p[i];
     29             }
     30             return false;
     31         } else {
     32             if(len != b.len) return len < b.len;
     33             for (int i = len; i >= 1; i--) {
     34                 if(p[i] != b.p[i]) return p[i] < b.p[i];
     35             }
     36             return false;
     37         }
     38     }
     39    bool operator > (const HP &b) const {
     40         if (flag && !b.flag) return false;
     41         if (!flag && b.flag) return true;
     42         if (flag && b.flag) {
     43             if(len != b.len) return len < b.len;
     44             for (int i = len; i >= 1; i--) {
     45                 if(p[i] != b.p[i]) return p[i] < b.p[i];
     46             }
     47             return false;
     48         } else {
     49             if(len != b.len) return len > b.len;
     50             for (int i = len; i >= 1; i--) {
     51                 if(p[i] != b.p[i]) return p[i] > b.p[i];
     52             }
     53             return false;
     54         }
     55     }
     56     bool operator <= (const HP &b) const {
     57         if (flag && !b.flag) return true;
     58         if (!flag && b.flag) return false;
     59         if (flag && b.flag) {
     60             if(len != b.len) return len > b.len;
     61             for (int i = len; i >= 1; i--) {
     62                 if(p[i] != b.p[i]) return p[i] > b.p[i];
     63             }
     64             return true;
     65         } else {
     66             if(len != b.len) return len < b.len;
     67             for (int i = len; i >= 1; i--) {
     68                 if(p[i] != b.p[i]) return p[i] < b.p[i];
     69             }
     70             return true;
     71         }
     72     }
     73     bool operator >= (const HP &b) const {
     74         if (flag && !b.flag) return false;
     75         if (!flag && b.flag) return true;
     76         if (flag && b.flag) {
     77             if(len != b.len) return len < b.len;
     78             for (int i = len; i >= 1; i--) {
     79                 if(p[i] != b.p[i]) return p[i] < b.p[i];
     80             }
     81             return true;
     82         } else {
     83             if(len != b.len) return len > b.len;
     84             for (int i = len; i >= 1; i--) {
     85                 if(p[i] != b.p[i]) return p[i] > b.p[i];
     86             }
     87             return true;
     88         }
     89     }
     90     bool operator == (const HP &b) const {
     91         if (flag ^ b.flag) return false;
     92         if (len != b.len) return false;
     93         for (int i = len; i >= 1; i--) {
     94             if (p[i] != b.p[i]) return false;
     95         }
     96         return true;
     97     }
     98     bool operator != (const HP &b) const {
     99         if (flag ^ b.flag) return true;
    100         if (len != b.len) return true;
    101         for (int i = len; i >= 1; i--) {
    102             if (p[i] != b.p[i]) return true;
    103         }
    104         return false;
    105     }
    106     HP operator + (const HP &B) const {//高精 + 高精 支持负数 
    107         HP b = B;
    108         if (!flag && b.flag) {
    109             b.flag = false;
    110             return (*this) - b;
    111         }
    112         if (flag && !b.flag) {
    113             HP a = (*this);
    114             a.flag = false;
    115             return b - a;
    116         }
    117         if (flag && B.flag) {
    118             HP a = (*this), c;
    119             a.flag = b.flag = false;
    120             c = a + b;
    121             c.flag = true;
    122             return c;
    123         }
    124         HP c;
    125         c.len = max(len, b.len);
    126         int re = 0;
    127         for (int i = 1; i <= c.len; i++) {
    128             re += p[i] + b.p[i];
    129             c.p[i] = re % 10;
    130             re /= 10;
    131         }
    132         while (re) {
    133             c.p[++c.len] = re % 10;
    134             re /= 10;
    135         }
    136         return c;
    137     }
    138     HP operator - (const HP &B) const {//高精 - 高精 支持负数 
    139         if (!flag && B.flag) {
    140             HP b = B;
    141             b.flag = false;
    142             return (*this + b);
    143         }
    144         if (flag && !B.flag) {
    145             HP a = (*this), c;
    146             a.flag = false;
    147             c = a + B;
    148             c.flag = false;
    149             return c;
    150         }
    151         if (flag && B.flag) {
    152             HP a = (*this), b = B, c;
    153             if (a < b) {
    154                 a.flag = b.flag = false;
    155                 c = a - b;
    156                 c.flag = true;
    157                 return c;
    158             } else {
    159                 a.flag = b.flag = false;
    160                 c = b - a;
    161                 return c;
    162             }
    163         }
    164         HP a = (*this), b = B, c;
    165         if (a < b) {c.flag = true; swap(a, b);}
    166         c.len = a.len;
    167         int re = 0;
    168         for (int i = 1; i <= c.len; i++) {
    169             re += a.p[i] - b.p[i];
    170             if (re < 0) {
    171                 c.p[i] = re + 10;
    172                 re = -1;
    173             } else {
    174                 c.p[i] = re;
    175                 re = 0;
    176             }
    177         }
    178         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    179         return c;
    180     }
    181     HP operator * (const int &B) const {//高精 * 单精 支持负数 
    182         if (B == 1) return (*this);
    183         int b = B;
    184         HP c;
    185         if (B < 0) {
    186             b = -B;
    187             c.flag = true;
    188         }
    189         if (flag) c.flag = true;
    190         c.len = len;
    191         int re = 0;
    192         for (int i = 1; i <= len; i++) {
    193             re += p[i] * b;
    194             c.p[i] = re % 10;
    195             re /= 10;
    196         }
    197         while (re) {
    198             c.p[++c.len] = re % 10;
    199             re /= 10;
    200         }
    201         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    202         return c;
    203     }
    204     HP operator * (const HP &b) const {//高精 * 高精 支持负数 
    205         if (b.len == 1 && b.p[1] == 1 && !b.flag) return (*this);
    206         if (len == 1 && p[1] == 1 && !flag) return b;
    207         HP c;
    208         if (flag || b.flag) {
    209             c.flag = flag ^ b.flag;
    210         }
    211         c.len = len + b.len;
    212         for (int i = 1; i <= len; i++) {
    213             int re = 0;
    214             for (int j = 1; j <= b.len; j++) {
    215                 c.p[i + j - 1] += p[i] * b.p[j] + re;
    216                 re = c.p[i + j - 1] / 10;
    217                 c.p[i + j - 1] %= 10;
    218             }
    219             c.p[i + b.len] = re;
    220         }
    221         while (c.p[c.len] > 0) c.len++;
    222         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    223         return c;
    224     }
    225     HP operator / (const int &b) const {//高精 / 单精 
    226         if (b == 1) return (*this);
    227         HP c;
    228         c.len = len;
    229         int re = 0;
    230         for (int i = len; i >= 1; i--) {
    231             re = re * 10 + p[i];
    232             c.p[i] = re / b;
    233             re %= b;
    234         }
    235         while (c.len > 1 && c.p[c.len] == 0) c.len--;
    236         return c;
    237     }
    238     bool div_cmp(const HP& b) {//用于优化高精 / 高精 
    239         if (len < b.len) return true;
    240         for (int i = 0; i < b.len; i++) {
    241             if (p[len - i] != b.p[b.len - i]) {
    242                 return p[len - i] < b.p[b.len - i];
    243             }
    244         }
    245         return false;
    246     }
    247     HP div_mul(int t) {//用于优化高精 / 高精 
    248         if (!t) return (*this);
    249         HP c;
    250         c.len = len + t;
    251         for (int i = 1; i <= len; i++) {
    252             c.p[i + t] = p[i];
    253         }
    254         return c;
    255     }
    256     HP operator / (HP b) const {//高精 / 高精 不支持负数 
    257         if (b.len == 1 && b.p[1] == 1) return (*this);
    258         if ((*this) < b) {
    259             HP c;
    260             c.len = 1, c.p[1] = 0;
    261             return c;
    262         }
    263         HP a = (*this), c, tmp;
    264         c.len = -1;
    265         int l, t;
    266         while (true) {
    267             l = a.len - b.len - a.div_cmp(b);
    268             if (l < 0) break;
    269             tmp = b.div_mul(l);
    270             t = 0;
    271             while (tmp <= a) {
    272                 a = a - tmp;
    273                 t++;
    274             }
    275             if (c.len == -1 && t) {
    276                 c.len = l + 1;
    277             }
    278             c.p[l + 1] = t;
    279         }
    280         return c;
    281     }
    282     HP operator % (const int b) const {//高精 % 单精 不支持负数
    283         HP d = (*this), c = (*this) / b;
    284         c = c * b;
    285         HP e = d - c;
    286         return e;
    287     }
    288     HP operator % (const HP &b) const {//高精 % 高精 不支持负数
    289         HP d = (*this), c = (*this) / b;
    290         c = c * b;
    291         HP e = d - c;
    292         return e;
    293     }
    294 };
    295 HP Max(const HP &a, const HP &b) {//高精max 不支持负数 
    296     if (a.len > b.len) {
    297         return a;
    298     } else if (a.len < b.len) {
    299         return b;
    300     }
    301     for (int i = a.len; i >= 1; i--) {
    302         if (a.p[i] > b.p[i]) {
    303             return a;
    304         } else if (a.p[i] < b.p[i]) {
    305             return b;
    306         }
    307     }
    308     return a;
    309 }
    310 HP Min(const HP &a, const HP &b) {//高精min 不支持负数 
    311     if (a.len > b.len) {
    312         return b;
    313     } else if (a.len < b.len) {
    314         return a;
    315     }
    316     for (int i = a.len; i >= 1; i--) {
    317         if (a.p[i] < b.p[i]) {
    318             return a;
    319         } else if (a.p[i] > b.p[i]) {
    320             return b;
    321         }
    322     }
    323     return a;
    324 }
    View Code

    Code2:

    压4位高精,不带除法

      1 const int power = 4;
      2 const int Base = 1e4;
      3 struct HP {
      4     int p[10001], len;
      5     bool flag;
      6     HP () {
      7         len = 1, memset(p, 0, sizeof p);
      8     }
      9     void in() {
     10         int a[10000007], cnt = 0;
     11         char ch = getchar();
     12         while (ch < '0' || ch > '9') {ch = getchar();}
     13         while ('0' <= ch && ch <= '9') {a[cnt++] = ch - '0'; ch = getchar();}
     14         for (int l = 0, r = cnt - 1; l < r;) {
     15             swap(a[l++], a[r--]);
     16         }
     17         memset(p, 0, sizeof 0);
     18         len = (cnt + power - 1) / power;
     19         for (int i = 0, t = 0, w; i < cnt; i++, w *= 10) {
     20             if (i % power == 0) w = 1, t++;
     21             p[t] += w * a[i];
     22         }
     23     }
     24     void make(int x) {
     25         int a[10000007], cnt = 0;
     26         while (x) a[cnt++] = x % 10, x /= 10;
     27         memset(p, 0, sizeof 0);
     28         len = (cnt + power - 1) / power;
     29         for (int i = 0, t = 0, w; i < cnt; i++, w *= 10) {
     30             if (i % power == 0) w = 1, t++;
     31             p[t] += w * a[i];
     32         }
     33     }
     34     void print() {
     35         printf("%d", p[len]);
     36         for (int i = len - 1; i >= 1; i--) {
     37             printf("%.4d", p[i]);
     38         }
     39         puts("");
     40     }
     41     void add(int x) {
     42         if (x || len) p[++len] = x;
     43     }
     44     void rev() {
     45         reverse(p + 1, p + 1 + len);
     46     }
     47     bool operator >= (const HP &b) const {
     48         if (len != b.len) return len > b.len;
     49         for (int i = len; i >= 1; i--) {
     50             if (p[i] != b.p[i]) return p[i] > b.p[i];
     51         }
     52         return true;
     53     }
     54     HP operator + (const HP &b) {
     55         HP c;
     56         c.len = max(len, b.len);
     57         int re = 0;
     58         for (int i = 1; i <= c.len; i++) {
     59             c.p[i] = p[i] + b.p[i] + re;
     60             re = c.p[i] / Base;
     61             c.p[i] %= Base;
     62         }
     63         while (re) c.p[++c.len] = re, re /= Base;
     64         return c;
     65     }
     66     HP operator - (const HP &b) {
     67         HP c = *(this);
     68         for (int i = 1; i <= c.len; i++) {
     69             c.p[i] -= b.p[i];
     70             if (c.p[i] < 0) {
     71                 c.p[i] += Base;
     72                 c.p[i + 1]--;
     73             }
     74         }
     75         while (c.len && !c.p[c.len]) c.len--;
     76         return c;
     77     }
     78     HP operator * (const int &b) {
     79         HP c;
     80         c.len = len;
     81         int re = 0;
     82         for (int i = 1; i <= c.len; i++) {
     83             c.p[i] = p[i] * b + re;
     84             re = c.p[i] / Base;
     85             c.p[i] %= Base;
     86         }
     87         while (re) c.p[++c.len] = re % Base, re /= Base;
     88         return c;
     89     }
     90     HP operator * (const HP &b) {
     91         HP c;
     92         c.len = len + b.len - 1;
     93         for (int i = 1; i <= len; i++) {
     94             for (int j = 1; j <= b.len; j++) {
     95                 c.p[i + j - 1] += p[i] * b.p[j];
     96                 c.p[i + j] += c.p[i + j - 1] / Base;
     97                 c.p[i + j - 1] %= Base;
     98             }
     99         }
    100         while (c.p[c.len + 1]) c.len++;
    101         return c;
    102     }
    103 };
    View Code

    当然,我也不太敢保证完全无锅,但是我觉得差不多(逃

  • 相关阅读:
    Dirichlet Process 和 Dirichlet Process Mixture模型
    也说说EM
    Seven Steps to Success Machine Learning in Practice
    matlab norm 范式
    nginx中时间的管理
    Android中解析网络请求的URL
    jsp if else c标签 总结
    Android开发系列之button事件的4种写法
    oracle中split的使用
    Unix C++(boost) 线程同步和线程组
  • 原文地址:https://www.cnblogs.com/Sundial/p/11830629.html
Copyright © 2011-2022 走看看