1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=10005;/*精度位数,自行调整*/
4 //1.如果需要控制输出位数的话,在str()里面把len调成需要的位数
5 //2.很大的位数是会re的,所以如果是幂运算的话,如 计算x^p的位数n, n=p*log(10)x+1;(注意要加一)
6 //3.还可以加上qmul,取模的过程也就是str(),c_str()再搞一次
7 class bign
8 {
9 //io*2 bign*5*2 bool*6
10 friend istream& operator>>(istream&,bign&);
11 friend ostream& operator<<(ostream&,const bign&);
12 friend bign operator+(const bign&,const bign&);
13 friend bign operator+(const bign&,int&);
14 friend bign operator*(const bign&,const bign&);
15 friend bign operator*(const bign&,int&);
16 friend bign operator-(const bign&,const bign&);
17 friend bign operator-(const bign&,int&);
18 friend bign operator/(const bign&,const bign&);
19 friend bign operator/(const bign&,int&);
20 friend bign operator%(const bign&,const bign&);
21 friend bign operator%(const bign&,int&);
22 friend bool operator<(const bign&,const bign&);
23 friend bool operator>(const bign&,const bign&);
24 friend bool operator<=(const bign&,const bign&);
25 friend bool operator>=(const bign&,const bign&);
26 friend bool operator==(const bign&,const bign&);
27 friend bool operator!=(const bign&,const bign&);
28
29 private://如果想访问len,改成public
30 int len,s[maxn];
31 public:
32 bign()
33 {
34 memset(s,0,sizeof(s));
35 len=1;
36 }
37 bign operator=(const char* num)
38 {
39 int i=0,ol;
40 ol=len=strlen(num);
41 while(num[i++]=='0'&&len>1)
42 len--;
43 memset(s,0,sizeof(s));
44 for(i=0; i<len; i++)
45 s[i]=num[ol-i-1]-'0';
46 return *this;
47 }
48 bign operator=(int num)
49 {
50 char s[maxn];
51 sprintf(s,"%d",num);
52 *this=s;
53 return *this;
54 }
55 bign(int num)
56 {
57 *this=num;
58 }
59 bign(const char* num)
60 {
61 *this=num;
62 }
63 string str() const
64 {
65 string res="";
66 for(int i=0; i<len; i++)
67 res=char(s[i]+'0')+res;
68 if(res=="")
69 res="0";
70 return res;
71 }
72 };
73 bool operator<(const bign& a,const bign& b)
74 {
75 int i;
76 if(a.len!=b.len)
77 return a.len<b.len;
78 for(i=a.len-1; i>=0; i--)
79 if(a.s[i]!=b.s[i])
80 return a.s[i]<b.s[i];
81 return false;
82 }
83 bool operator>(const bign& a,const bign& b)
84 {
85 return b<a;
86 }
87 bool operator<=(const bign& a,const bign& b)
88 {
89 return !(a>b);
90 }
91 bool operator>=(const bign& a,const bign& b)
92 {
93 return !(a<b);
94 }
95 bool operator!=(const bign& a,const bign& b)
96 {
97 return a<b||a>b;
98 }
99 bool operator==(const bign& a,const bign& b)
100 {
101 return !(a<b||a>b);
102 }
103 bign operator+(const bign& a,const bign& b)
104 {
105 int up=max(a.len,b.len);
106 bign sum;
107 sum.len=0;
108 for(int i=0,t=0;t||i<up; i++)
109 {
110 if(i<a.len)
111 t+=a.s[i];
112 if(i<b.len)
113 t+=b.s[i];
114 sum.s[sum.len++]=t%10;
115 t/=10;
116 }
117 return sum;
118 }
119 bign operator+(const bign& a,int& b)
120 {
121 bign c=b;
122 return a+c;
123 }
124 bign operator*(const bign& a,const bign& b)
125 {
126 bign res;
127 for(int i=0; i<a.len; i++)
128 {
129 for(int j=0; j<b.len; j++)
130 {
131 res.s[i+j]+=(a.s[i]*b.s[j]);
132 res.s[i+j+1]+=res.s[i+j]/10;
133 res.s[i+j]%=10;
134 }
135 }
136 res.len=a.len+b.len;
137 while(res.s[res.len-1]==0&&res.len>1)
138 res.len--;
139 if(res.s[res.len])
140 res.len++;
141 return res;
142 }
143 bign operator*(const bign& a,int& b)
144 {
145 bign c=b;
146 return a*c;
147 }
148 //只支持大数减小数
149 bign operator-(const bign& a,const bign& b)
150 {
151 bign res;
152 int len=a.len;
153 for(int i=0; i<len; i++)
154 {
155 res.s[i]+=a.s[i]-b.s[i];
156 if(res.s[i]<0)
157 {
158 res.s[i]+=10;
159 res.s[i+1]--;
160 }
161 }
162 while(res.s[len-1]==0&&len>1)
163 len--;
164 res.len=len;
165 return res;
166 }
167 bign operator-(const bign& a,int& b)
168 {
169 bign c=b;
170 return a-c;
171 }
172 bign operator/(const bign& a,const bign& b)
173 {
174 int i,len=a.len;
175 bign res,f;
176 for(i=len-1; i>=0; i--)
177 {
178 f=f*10;
179 f.s[0]=a.s[i];
180 while(f>=b)
181 {
182 f=f-b;
183 res.s[i]++;
184 }
185 }
186 while(res.s[len-1]==0&&len>1)
187 len--;
188 res.len=len;
189 return res;
190 }
191 bign operator/(const bign& a,int& b)
192 {
193 bign c=b;
194 return a/c;
195 }
196 bign operator%(const bign& a,const bign& b)
197 {
198 int len=a.len;
199 bign f;
200 for(int i=len-1; i>=0; i--)
201 {
202 f=f*10;
203 f.s[0]=a.s[i];
204 while(f>=b)
205 f=f-b;
206 }
207 return f;
208 }
209 bign operator%(const bign& a,int& b)
210 {
211 bign c=b;
212 return a%c;
213 }
214 bign& operator+=(bign& a,const bign& b)
215 {
216 a=a+b;
217 return a;
218 }
219 bign& operator-=(bign& a,const bign& b)
220 {
221 a=a-b;
222 return a;
223 }
224 bign& operator*=(bign& a,const bign& b)
225 {
226 a=a*b;
227 return a;
228 }
229 bign& operator/=(bign& a,const bign& b)
230 {
231 a=a/b;
232 return a;
233 }
234 bign& operator++(bign& a)
235 {
236 a=a+1;
237 return a;
238 }
239 bign& operator++(bign& a,int)
240 {
241 bign t=a;
242 a=a+1;
243 return t;
244 }
245 bign& operator--(bign& a)
246 {
247 a=a-1;
248 return a;
249 }
250 bign& operator--(bign& a,int)
251 {
252 bign t=a;
253 a=a-1;
254 return t;
255 }
256 istream& operator>>(istream &in,bign& x)
257 {
258 string s;
259 in>>s;
260 x=s.c_str();
261 return in;
262 }
263 ostream& operator<<(ostream &out,const bign& x)
264 {
265 out<<x.str();
266 return out;
267 }
268 int main()
269 {
270 bign a, b;
271 return 0;
272 }