• 【原创】高精度(压位储存)模板


    无聊写了个高精度模板玩玩......

    (以前有些地方写错了TAT)

      1 /*
      2 唐代李白
      3 《江夏别宋之悌》
      4 楚水清若空,遥将碧海通。人分千里外,兴在一杯中。
      5 谷鸟吟晴日,江猿啸晚风。平生不下泪,于此泣无穷.
      6 */
      7 #include <iostream>
      8 #include <cstdio>
      9 #include <algorithm>
     10 #include <cstring>
     11 #include <vector>
     12 #include <utility>
     13 #include <iomanip>
     14 #include <string>
     15 #include <cmath>
     16 #include <queue>
     17 #include <assert.h>
     18 #include <map>
     19 #include <ctime>
     20 #include <cstdlib>
     21 #include <stack>
     22 #include <set> 
     23 #define LOCAL
     24 const int INF = 0x7fffffff;
     25 const int MAXN = 100000  + 10;
     26 const int maxnode = 20000 * 2 + 200000 * 20;
     27 const int MAXM = 50000 + 10;
     28 const int MAX = 100;
     29 using namespace std;
     30 struct hp{
     31        int num[MAX];
     32        ////hp(){num[0] = 0;}
     33        hp & operator = (const char *str);
     34        hp & operator = (int b);
     35        
     36        //最好先比较一下再大的减小的 
     37        hp operator + (const hp &)const;
     38        hp operator * (const hp &)const;
     39        hp operator - (const hp &)const;
     40        hp operator / (const hp &)const;
     41        
     42        bool operator < (const hp &)const;
     43        bool operator > (const hp &)const;
     44        bool operator == (const hp &)const;
     45        bool operator >= (const hp &)const;
     46        bool operator <= (const hp &)const;
     47 };
     48 bool hp::operator < (const hp &b)const{
     49      if (num[0] < b.num[0]) return 1;
     50      for (int i = num[0]; i >= 1; i--){
     51          if (num[i] < b.num[i]) return 1;
     52          else if (num[i] > b.num[i]) return 0;
     53      }
     54      return 0;
     55 }
     56 bool hp::operator > (const hp &b)const{return b < (*this);}
     57 bool hp::operator == (const hp &b)const {return ((!(b < (*this))) && (!(b > (*this))));}
     58 bool hp::operator <= (const hp &b)const {return !((*this) > b);}
     59 bool hp::operator >= (const hp &b)const {return !((*this) < b);}
     60 //注意d为余数 
     61 hp hp::operator / (const hp &b)const{
     62     hp d, c;
     63     memset(c.num, 0, sizeof(c));
     64     memset(d.num, 0, sizeof(d));
     65     c.num[0] = num[0] + b.num[0] + 1;//和乘法的长度是一样的,长除法..
     66     d.num[0] = 0;
     67     
     68     for (int i = num[0]; i >= 1; i--){
     69         //这个是腾出一个d.num[1]的空间 
     70         memmove(d.num + 2, d.num + 1, sizeof(d.num) - sizeof(int) * 2);
     71         d.num[0]++;
     72         d.num[1] = num[i];
     73         
     74         int l = 0, r = 9999, mid;//枚举除数
     75         while (l < r){//不同的写法当然可以 
     76               int mid = (l + r) >> 1;
     77               hp tmp; 
     78               tmp = mid;tmp = tmp * b;
     79               //b乘以乘数当然不能大于余数 
     80               if (tmp <= d) l = mid + 1;
     81               else r  = mid;
     82         } 
     83         c.num[i] = r - 1;
     84         hp tmp; tmp = r - 1;//r - 1为得到答案 
     85         tmp = tmp * b; 
     86         d = d - tmp;
     87     }
     88     while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
     89     return c;         
     90 }
     91 hp & hp::operator = (const int b){
     92    char str[MAX];
     93    sprintf(str, "%d", b);
     94    return *this = str; 
     95 }
     96 hp & hp::operator = (const char *str){
     97    int len = strlen(str), k = 1;
     98    memset(num, 0, sizeof(num));
     99    num[0] = 1;
    100    for (int i = len - 1 ; i >= 0; i--){
    101        if (k == 10000) {k = 1; num[0]++;}
    102        num[num[0]] += k * (str[i] - '0');
    103        k *= 10;
    104    }
    105    return *this;
    106 }
    107 hp hp::operator + (const hp &b)const{
    108    hp c;
    109    memset(c.num, 0, sizeof(c.num));
    110    c.num[0] = max(num[0], b.num[0]);
    111    for (int i = 1; i <= c.num[0]; i++){
    112        c.num[i] += num[i] + b.num[i];
    113        c.num[i + 1] += c.num[i] / 10000;
    114        c.num[i] %= 10000;
    115    }
    116    if (c.num[c.num[0] + 1] > 0) c.num[0]++;
    117    return c;
    118 }
    119 hp hp::operator * (const hp &b)const{
    120    hp c;
    121    memset(c.num, 0, sizeof(c.num));
    122    c.num[0] = num[0] + b.num[0] + 1;
    123    for (int i = 1; i <= num[0]; i++)
    124    for (int j = 1; j <= b.num[0]; j++){
    125        c.num[i + j - 1] += num[i] * b.num[j];
    126        c.num[i + j] += c.num[i + j - 1] / 10000;
    127        c.num[i + j - 1] %= 10000;
    128    }
    129    while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
    130    return c;
    131 }
    132 hp hp::operator - (const hp &b)const{
    133    hp c;
    134    memset(c.num, 0, sizeof(c.num));
    135    c.num[0] = max(num[0], b.num[0]);
    136    for (int i = 1; i <= c.num[0]; i++){
    137        c.num[i] += num[i] - b.num[i];
    138        if (c.num[i] < 0){
    139           c.num[i + 1]--;
    140           c.num[i] += 10000; 
    141        }
    142    }
    143    while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--;
    144    return c;
    145 }
    146 void print(hp c){
    147      printf("%d", c.num[c.num[0]]);
    148      for (int i = c.num[0] - 1; i >= 1; i--) printf("%04d", c.num[i]);
    149      return;
    150 }
    151 
    152 int main(){
    153    #ifdef LOCAL
    154    freopen("data.txt", "r", stdin);
    155    freopen("out.txt", "w", stdout);
    156    #endif
    157    hp c;
    158    c = 0;
    159    hp a; 
    160    a = 20300;
    161    hp b;
    162    //print(a);
    163    //print(c);
    164    b = c / a; 
    165    print(b);
    166    //printf("%d", (a == c));
    167    return 0; 
    168 }
    View Code
  • 相关阅读:
    CodeForces 801C 二分,浮点数
    Cashier (codeforces 1059A)
    A + B Problem II (hdu1002)
    A water problem (hdu-5832)
    思维风暴 codeforces (1060A) Phone Numbers
    cin输入过慢用scanf???现在才知道cin可以加速
    uva 227 Puzzle (UVA
    uva 12108 Extraordinarily Tired Students (UVA
    uva340 Master-Mind Hints (UVA
    东抄西凑的凑出来了一个主题。。。代码高亮部分因为之前使用的都是另一个编译器导致没法高亮
  • 原文地址:https://www.cnblogs.com/hoskey/p/3739769.html
Copyright © 2020-2023  润新知