万能的高精度模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
const int MAXL=1e3;
struct Int {
int len,z[MAXL];
Int() {memset(z,0,sizeof(z));len=1;}
void clean_pre_zero() {while(len>1&&!z[len-1])len--;}
void read() {char s[MAXL];scanf("%s",s);*this=s;}
void print() {for(int i=len-1;i>=0;i--)printf("%d",z[i]);}
Int operator=(const char *num) {
len=strlen(num);
for(int i=0;i<len;i++)
z[i]=num[len-i-1]-'0';
return *this;
}
Int operator=(const int &num) {
char s[MAXL];
sprintf(s,"%d",num);
return *this=s;
}
Int(const int num) {*this=num;}
Int(const char *num) {*this=num;}
Int operator+(const Int &b) {
Int res;
res.len=max(len,b.len)+1;
for(int i=0;i<res.len;i++)
res.z[i]=z[i]+b.z[i];
for(int i=0;i<res.len;i++)
res.z[i+1]+=res.z[i]/10,res.z[i]%=10;
res.clean_pre_zero();
return res;
}
Int operator-(const Int &b) {
Int res;
res.len=len;
for(int i=0;i<res.len;i++)
res.z[i]=z[i]-b.z[i];
for(int i=0;i<res.len;i++)
if(res.z[i]<0) {
res.z[i+1]+=res.z[i]/10-1;
res.z[i]%=10,res.z[i]+=10;
}
res.clean_pre_zero();
return res;
}
Int operator*(const Int &b) {
Int res;
res.len=len+b.len;
for(int i=0;i<len;i++)
for(int j=0;j<b.len;j++)
res.z[i+j]+=z[i]*b.z[j];
for(int i=0;i<res.len;i++)
res.z[i+1]+=res.z[i]/10,
res.z[i]%=10;
res.clean_pre_zero();
return res;
}
Int operator/(const Int &b) {
Int res,cur;
res.len=len;
for(int i=len-1;i>=0;i--) {
cur=cur*10+z[i];
while(cur>=b)
cur=cur-b,res.z[i]++;
}
res.clean_pre_zero();
return res;
}
Int operator%(const Int &b) {
Int res,cur;
res.len=len;
for(int i=len-1;i>=0;i--) {
cur=cur*10+z[i];
while(cur>=b)
cur=cur-b,res.z[i]++;
}
cur.clean_pre_zero();
return cur;
}
bool operator<(const Int &b)const {
if(len!=b.len) return len<b.len;
for(int i=len-1;i>=0;i--)
if(z[i]!=b.z[i])
return z[i]<b.z[i];
return false;
}
bool operator>(const Int &b)const {return b<*this;}
bool operator==(const Int &b)const {return !(*this>b)&&!(*this<b);}
bool operator>=(const Int &b)const {return *this>b||*this==b;}
bool operator<=(const Int &b)const {return *this<b||*this==b;}
bool operator!=(const Int &b)const {return !(b==*this);}
void operator+=(const Int &b) {*this=*this+b;}
void operator-=(const Int &b) {*this=*this-b;}
void operator*=(const Int &b) {*this=*this*b;}
void operator/=(const Int &b) {*this=*this/b;}
void operator%=(const Int &b) {*this=*this%b;}
};