-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBigInteger.cpp
More file actions
81 lines (76 loc) · 2.78 KB
/
BigInteger.cpp
File metadata and controls
81 lines (76 loc) · 2.78 KB
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
const int bignumlen=3000;
const int Blen=8;
const ll base=100000000;
struct bignum{
int len;
ll data[bignumlen];
ll &operator [](int x){ return(data[x]);}
const ll &operator [](int x)const { return(data[x]);}
bignum (){
memset(data,0,sizeof(data));
len=0;
}
void clear(){
for(int i=len;i>=1;--i)data[i]=0;
len=0;
}
int check (const bignum &a,const bignum &b){
if(a.len>b.len)return(0);
if(b.len>a.len)return(1);
for(int i=a.len;i>=1;--i){
if(a.data[i]<b.data[i])return(1);
if(b.data[i]<a.data[i])return(0);
}
return 2;
}
bignum operator=(const bignum &x){
for(int i=x.len+1;i<=len;++i)data[i]=0;
for(int i=1;i<=x.len;++i)data[i]=x.data[i];
len=x.len;
return *this;
}
bignum operator=(ll x){
for(int i=len;i>=0;--i)data[i]=0;
len=0;
while(x){
data[++len]=x%base;
x/=base;
}
return *this;
}
bignum(ll x){
memset(data,0,sizeof(data));
len=0;
(*this)=x;
}
bignum operator *(const bignum &b){
int i,j;
bignum tmp;
for(i=1;i<=len;++i)if(data[i]!=0)
for(j=1;j<=b.len;++j)if(b.data[j]!=0){
tmp.data[i+j-1]+=data[i]*b.data[j];
tmp.data[i+j]+=tmp.data[i+j-1]/base;
tmp.data[i+j-1]%=base;
}
tmp.len=len+b.len-1;
while(tmp.data[tmp.len+1])tmp.len++;
return tmp;
}
bignum operator +(const bignum &b){
bignum tmp;
int i,l=max(len,b.len);
for(i=1;i<=l;++i)tmp[i]=data[i]+b[i];
for(i=1;i<=l;++i)tmp[i+1]+=tmp[i]/base,tmp[i]%=base;
tmp.len=l;
if(tmp[tmp.len+1])tmp.len++;
return tmp;
}
bignum operator +=(const bignum &b){return *this=(*this+b);}
bignum operator *=(const bignum &b){return *this=(*this*b);}
bignum operator *=(ll x) {return( *this=(*this *x));}
bignum operator +=(ll x) {return( *this=(*this +x));}
void write(){
printf("%I64d",data[len]);
for(int i=len-1;i>=1;--i)printf("%0*I64d",Blen,data[i]);
}
};