1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 struct bign{
6 int len;
7 int num[1501];
8 bool flag;
9 bign(){len=1;flag=0;memset(num,0,sizeof num);}
10 bign(int x){
11 if(!x)return;
12 len=0;
13 while(x)num[++len]=x%10;x/=10;
14 }
15 };
16 bool operator < (bign a,bign b){
17 if(a.len<b.len)return 1;
18 if(a.len>b.len)return 0;
19 for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
20 return 1;
21 }
22 bool operator == (bign a,bign b){
23 if(a.len!=b.len)return 0;
24 for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
25 return 1;
26 }
27 bign operator + (bign a,bign b){
28 bign ans;
29 int i=1,x=0;
30 while(i<=a.len || i<=b.len){
31 ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
32 x=ans.num[i]/10;ans.num[i]%=10; i++;
33 }
34 ans.num[i]=x;
35 if(!ans.num[i])i--;
36 ans.len=i;
37 return ans;
38 }
39 bign operator * (bign a,bign b){
40 bign ans;
41 int len=a.len+b.len;
42 for(int i=1;i<=a.len;i++){
43 int x=0;
44 for(int j=1;j<=b.len;j++){
45 ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
46 x=ans.num[i+j-1]/10;
47 ans.num[i+j-1]%=10;
48 }
49 ans.num[i+b.len]+=x;
50 }
51 while(!ans.num[len] && len>1)len--;
52 ans.len=len;
53 return ans;
54 }
55 bign operator - (bign a,bign b){
56 bign ans;
57 if(a==b)return ans;
58 if(b<a){
59 for(int i=1;i<=a.len;i++){
60 if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
61 ans.num[i]=a.num[i]-b.num[i];
62 if(ans.num[i]<0){
63 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位
64 }
65 }
66 }
67 else{
68 ans.flag=1;// this number(I mean the ans) is smaller than zero
69 for(int i=1;i<=b.len;i++){
70 if(b.num[i]<0){
71 b.num[i]+=10; b.num[i+1]--;
72 }
73 ans.num[i]=b.num[i]-a.num[i];
74 if(ans.num[i]<0){
75 ans.num[i]+=10; b.num[i+1]--;
76 }
77 }
78 }
79 int len=max(a.len,b.len);
80 while(ans.num[len]<=0 && len>1)len--;
81 ans.len=len;
82 return ans;
83 }