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

    Updated on 11.03 重载小于号的更新

      1 struct Big {
      2     const static int N = 1005;
      3     int a[N];
      4     bool flag;
      5     Big(){ms(a,0),flag = 0;}
      6     Big( ll x ){
      7         ms(a,0),flag = 0;
      8         if(x == 0) return;
      9         flag = (x < 0);
     10         x = max(x,-x);
     11         while(x) a[++a[0]] = x%10,x/=10;
     12         clr0();
     13     }
     14     void read() {
     15         ms(a,0),flag = 0;
     16         char s[N];
     17         scanf("%s",s+1);
     18         a[0] = strlen(s+1);
     19         if(s[1] == '-') a[0]--,flag = 1;
     20         rep(i,1,a[0]) a[i] = s[a[0] - i + flag + 1] - '0';
     21         clr0();
     22     }
     23     void clr0() {
     24         while(a[0] && a[a[0]] == 0) a[0]--;
     25         while(a[0] < 0) a[0]++;
     26         if(a[0] == 0) flag = 0;
     27     }
     28     void print() {
     29         clr0();
     30         if(!a[0]) return void(puts("0"));
     31         if(flag) putchar('-');
     32         per(i,a[0],1) putchar(a[i] + '0');
     33         putchar('
    ');
     34     }
     35     //clr0 before use
     36     bool operator < (const Big &o) const {
     37         if(o.a[0] == 0) return flag;
     38         if(a[0] == 0) return !o.flag;
     39         if(flag ^ o.flag) return flag;
     40         if(a[0] ^ o.a[0]) return ((a[0] < o.a[0]) ^ flag);
     41         per(i,a[0],1) {
     42             if(a[i] > o.a[i]) return flag;
     43             if(a[i] < o.a[i]) return !flag;
     44         }
     45         return 0;
     46     }
     47     bool operator == (const Big &o) const {
     48         Big r = *this;
     49         return !(r < o || o < r);
     50     }
     51     //保证同号
     52     Big operator + (const Big &o) const {
     53         if(a[0] == 0) return o;
     54         if(o.a[0] == 0) return *this;
     55         if(flag ^ o.flag) {
     56             Big x = *this,y = o;
     57             if(x.flag) {
     58                 x.flag = 0;
     59                 return y - x;
     60             }
     61             else {
     62                 y.flag = 0;
     63                 return x - y;
     64             }
     65         }
     66         Big ans;
     67         ms(ans.a,0);
     68         ans.a[0] = max(a[0],o.a[0]),ans.flag = flag;
     69         rep(i,1,ans.a[0]) {
     70             ans.a[i] += a[i] + o.a[i];
     71             if(i == ans.a[0] && ans.a[i] >= 10) {
     72                 ans.a[0]++;
     73             }
     74             ans.a[i+1] += ans.a[i] / 10;
     75             ans.a[i] %= 10;
     76         }
     77         return ans;
     78     }
     79     //保证同号
     80     Big operator - (const Big &o) const {
     81         Big x = *this;
     82         Big y = o;
     83         if(flag ^ o.flag) {
     84             y.flag ^= 1;
     85             return x + y;
     86         }
     87         Big ans;
     88         ms(ans.a,0);
     89         ans.a[0] = ans.flag = 0;
     90         ans.flag = flag;
     91         x.flag = y.flag = 0;
     92         if(x == y) return ans;
     93         if(x < y) swap(x,y),ans.flag ^= 1;
     94         rep(i,1,x.a[0]) {
     95             if(x.a[i] < y.a[i]) x.a[i] += 10,x.a[i+1]--;
     96             ans.a[i] = x.a[i] - y.a[i];
     97         }
     98         ans.a[0] = x.a[0];
     99         ans.clr0();
    100         return ans;
    101     }
    102     //O(n^2) 高精乘
    103     Big operator * (const Big &o) const {
    104         if(a[0] == 0) return *this;
    105         if(o.a[0] == 0) return o;
    106         Big ans;
    107         ms(ans.a,0);
    108         ans.a[0] = a[0] + o.a[0],ans.flag = o.flag ^ flag;
    109         rep(i,1,a[0]) rep(j,1,o.a[0])
    110             ans.a[i+j-1] += a[i] * o.a[j];
    111         rep(i,1,ans.a[0]) {
    112             if(i == ans.a[0] && ans.a[i] >= 10) ans.a[0]++;
    113             ans.a[i+1] += ans.a[i] / 10;
    114             ans.a[i] %= 10;
    115         }
    116         return ans;
    117     }
    118 };

    仍然欢迎Hack

    > 别忘了 总有人在等着你
  • 相关阅读:
    连续时间单位冲激信号δ(t)的基本性质
    数据结构练习
    数据结构练习
    数据结构练习
    使用 matplotlib 绘制带日期的坐标轴
    数据结构练习
    c++ primer 练习10.33_p363
    C++迭代器之'插入迭代器
    C++ 11 Lambda表达式
    《C++ Primer》读书笔记—第十章 泛型算法
  • 原文地址:https://www.cnblogs.com/yuyanjiaB/p/9895512.html
Copyright © 2011-2022 走看看