模板 高精度

Posted yuyanjiab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 高精度相关的知识,希望对你有一定的参考价值。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<queue>
  5 #define ms(a,b) memset(a,b,sizeof a)
  6 #define rep(i,a,n) for(int i = a;i <= n;i++)
  7 #define per(i,n,a) for(int i = n;i >= a;i--)
  8 #define inf 1000000007
  9 using namespace std;
 10 typedef long long ll;
 11 typedef double D;
 12 #define eps 1e-8
 13 ll read() {
 14     ll as = 0,fu = 1;
 15     char c = getchar();
 16     while(c < 0 || c > 9) {
 17         if(c == -) fu = -1;
 18         c = getchar();
 19     }
 20     while(c >= 0 && c <= 9) {
 21         as = as * 10 + c - 0;
 22         c = getchar();
 23     }
 24     return as * fu;
 25 }
 26 struct Big {
 27     const static int N = 5005;
 28     int a[N];
 29     bool flag;
 30     Big(){ms(a,0),flag = 0;}
 31     Big( ll x ){
 32         ms(a,0),flag = 0;
 33         flag = (x < 0);
 34         x = max(x,-x);
 35         while(x) a[++a[0]] = x%10,x/=10;
 36         clr0();
 37     }
 38     void read() {
 39         ms(a,0),flag = 0;
 40         char s[N];
 41         scanf("%s",s+1);
 42         a[0] = strlen(s+1);
 43         if(s[1] == -) a[0]--,flag = 1;
 44         rep(i,1,a[0]) a[i] = s[a[0] - i + flag + 1] - 0;
 45         clr0();
 46     }
 47     void clr0() {
 48         while(a[0] && a[a[0]] == 0) a[0]--;
 49         while(a[0] < 0) a[0]++;
 50         if(a[0] == 0) flag = 0;
 51     }
 52     void print() {
 53         clr0();
 54         if(!a[0]) return void(puts("0"));
 55         if(flag) putchar(-);
 56         per(i,a[0],1) putchar(a[i] + 0);
 57         putchar(
);
 58     }
 59     //clr0 before use
 60     bool operator < (const Big &o) const {
 61         if(o.a[0] == 0) return flag;
 62         if(a[0] == 0) return !o.flag;
 63         if(flag ^ o.flag) return flag;
 64         if(flag) {
 65             rep(i,0,a[0]) {
 66                 if(a[i] > o.a[i]) return 1;
 67                 if(a[i] < o.a[i]) return 0;
 68             }
 69             return 0;
 70         } else {
 71             rep(i,0,a[0]) {
 72                 if(a[i] < o.a[i]) return 1;
 73                 if(a[i] > o.a[i]) return 0;
 74             }
 75             return 0;
 76         }
 77     }
 78     bool operator == (const Big &o) const {
 79         Big r = *this;
 80         return !(r < o || o < r);
 81     }
 82     //保证同号
 83     Big operator + (const Big &o) const {
 84         if(a[0] == 0) return o;
 85         if(o.a[0] == 0) return *this;
 86         if(flag ^ o.flag) {
 87             Big x = *this,y = o;
 88             if(x.flag) {
 89                 x.flag = 0;
 90                 return y - x;
 91             }
 92             else {
 93                 y.flag = 0;
 94                 return x - y;
 95             }
 96         }
 97         Big ans;
 98         ms(ans.a,0);
 99         ans.a[0] = max(a[0],o.a[0]),ans.flag = flag;
100         rep(i,1,ans.a[0]) {
101             ans.a[i] += a[i] + o.a[i];
102             if(i == ans.a[0] && ans.a[i] >= 10) {
103                 ans.a[0]++;
104             }
105             ans.a[i+1] += ans.a[i] / 10;
106             ans.a[i] %= 10;
107         }
108         return ans;
109     }
110     //保证同号
111     Big operator - (const Big &o) const {
112         Big x = *this;
113         Big y = o;
114         if(flag ^ o.flag) {
115             y.flag ^= 1;
116             return x + y;
117         }
118         Big ans;
119         ms(ans.a,0);
120         ans.a[0] = ans.flag = 0;
121         ans.flag = flag;
122         x.flag = y.flag = 0;
123         if(x == y) return ans;
124         if(x < y) swap(x,y),ans.flag ^= 1;
125         rep(i,1,x.a[0]) {
126             if(x.a[i] < y.a[i]) x.a[i] += 10,x.a[i+1]--;
127             ans.a[i] = x.a[i] - y.a[i];
128         }
129         ans.a[0] = x.a[0];
130         ans.clr0();
131         return ans;
132     }
133     //O(n^2) 高精乘
134     Big operator * (const Big &o) const {
135         if(a[0] == 0) return *this;
136         if(o.a[0] == 0) return o;
137         Big ans;
138         ms(ans.a,0);
139         ans.a[0] = a[0] + o.a[0],ans.flag = o.flag ^ flag;
140         rep(i,1,a[0]) rep(j,1,o.a[0])
141             ans.a[i+j-1] += a[i] * o.a[j];
142         rep(i,1,ans.a[0]) {
143             if(i == ans.a[0] && ans.a[i] >= 10) ans.a[0]++;
144             ans.a[i+1] += ans.a[i] / 10;
145             ans.a[i] %= 10;
146         }
147         return ans;
148     }
149 }x,y,z;
150 Big zero = Big(0);
151 Big one = Big(1);
152 Big two = Big(2);
153 Big three = Big(3);
154 #define Max(a,b) ((b)<(a)?(a):(b))
155 #define Min(a,b) ((a)<(b)?(a):(b))
156 void tst() {
157     while(1) {
158         x.read(),y.read();
159         z = x + y;
160         printf("plus:"),z.print();
161         z = x - y;
162         printf("minus:"),z.print();
163         z = x * y;
164         printf("mult:"),z.print();
165     }
166 }

今天终于写完了高精真开心

热烈欢迎大家Hack

提供数据 [email protected]

以上是关于模板 高精度的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段2——.vue文件的模板

VSCode自定义代码片段(vue主模板)

GLSL-片段着色器不同部分的精度不同

Eclipse 中的通用代码片段或模板

PHP 精度计算引发的灾难性Bug

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段