【大整数模板】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 struct BigInteger 6 { 7 int len; 8 int arg[2005]; 9 BigInteger(int x = 0){ 10 IntToBigInteger(x); 11 } 12 BigInteger(char *str){ 13 CharToBigInteger(str); 14 } 15 void print() 16 { 17 for (int i = len - 1; i >= 0; i--){ 18 cout<<arg[i]; 19 } 20 cout<<endl; 21 } 22 void CharToBigInteger(char *str) 23 { 24 len = strlen(str); 25 memset(arg, 0, sizeof(arg)); 26 for (int i = 0; i < len; i++){ 27 arg[i] = str[len - i - 1] - 48; 28 } 29 while(len > 0 && arg[len-1] == 0){ 30 len--; 31 } 32 } 33 void IntToBigInteger(int x) 34 { 35 len = 0; 36 memset(arg, 0, sizeof(arg)); 37 do{ 38 arg[len++] = x % 10; 39 x = x / 10; 40 }while (x); 41 } 42 friend istream &operator>>(istream &in, BigInteger &w) 43 { 44 char str[1005]; 45 in>>str; 46 w.CharToBigInteger(str); 47 return in; 48 } 49 friend ostream& operator<<(ostream &out, BigInteger w) 50 { 51 for (int i = w.len - 1; i >= 0; i--){ 52 out<<w.arg[i]; 53 } 54 return out; 55 } 56 friend bool operator==(BigInteger r, BigInteger w) 57 { 58 if (r.len != w.len) return false; 59 int i = r.len - 1; 60 while (i >= 0){ 61 if (r.arg[i] != w.arg[i]) 62 return false; 63 i--; 64 } 65 return true; 66 } 67 friend bool operator<=(BigInteger r, BigInteger w) 68 { 69 if (r.len < w.len) return true; 70 else if (w.len < r.len) return false; 71 int i = r.len - 1; 72 while (i >= 0){ 73 if (r.arg[i]<w.arg[i]) 74 return true; 75 else if (r.arg[i]>w.arg[i]) 76 return false; 77 i--; 78 } 79 return true; 80 } 81 friend bool operator<=(int x, BigInteger w) 82 { 83 BigInteger r; 84 r.IntToBigInteger(x); 85 if (r.len < w.len) return true; 86 else if (w.len < r.len) return false; 87 int i = r.len - 1; 88 while (i >= 0){ 89 if (r.arg[i]<w.arg[i]) 90 return true; 91 else if (r.arg[i]>w.arg[i]) 92 return false; 93 i--; 94 } 95 return true; 96 } 97 friend bool operator<(BigInteger r, BigInteger w) 98 { 99 if (r.len < w.len) return true; 100 else if (w.len < r.len) return false; 101 int i = r.len - 1; 102 while (i >= 0){ 103 if (r.arg[i]<w.arg[i]) 104 return true; 105 else if (r.arg[i]>w.arg[i]) 106 return false; 107 i--; 108 } 109 return false; 110 } 111 friend bool operator<(int x, BigInteger w) 112 { 113 BigInteger r; 114 r.IntToBigInteger(x); 115 if (r.len < w.len) return true; 116 else if (w.len < r.len) return false; 117 int i = r.len - 1; 118 while (i >= 0){ 119 if (r.arg[i]<w.arg[i]) 120 return true; 121 else if (r.arg[i]>w.arg[i]) 122 return false; 123 i--; 124 } 125 return false; 126 } 127 friend BigInteger operator+(int r, BigInteger w){ 128 w.arg[0] += r; 129 int i = 0; 130 while (w.arg[i] >= 10){ 131 w.arg[i + 1] += w.arg[i] / 10; 132 w.arg[i] = w.arg[i] % 10; 133 i++; 134 } 135 if(w.arg[i]) i++; 136 w.len = i > w.len ? i : w.len; 137 return w; 138 } 139 friend BigInteger operator+(BigInteger w, int r) 140 { 141 w.arg[0] += r; 142 int i = 0; 143 while (w.arg[i] >= 10){ 144 w.arg[i + 1] += w.arg[i] / 10; 145 w.arg[i] = w.arg[i] % 10; 146 i++; 147 } 148 if(w.arg[i]) i++; 149 w.len = i > w.len ? i : w.len; 150 return w; 151 } 152 friend BigInteger operator+(BigInteger r, BigInteger w) 153 { 154 int len = r.len > w.len ? r.len : w.len; 155 for (int i = 0; i < len; i++){ 156 if(i < w.len) 157 r.arg[i] = r.arg[i] + w.arg[i]; 158 r.arg[i + 1] += r.arg[i] / 10; 159 r.arg[i] = r.arg[i] % 10; 160 } 161 while (r.arg[len] >= 10){ 162 r.arg[len + 1] += r.arg[len] / 10; 163 r.arg[len] = r.arg[len] % 10; 164 len++; 165 } 166 if(r.arg[len]) len++; 167 r.len = len > r.len ? len : r.len; 168 return r; 169 } 170 friend BigInteger operator-(BigInteger r, BigInteger w) 171 { 172 for (int i = 0; i < r.len; i++){ 173 if (r.arg[i] >= w.arg[i]) 174 r.arg[i] = r.arg[i] - w.arg[i]; 175 else{ 176 r.arg[i] = r.arg[i] + 10; 177 r.arg[i + 1] = r.arg[i + 1] - 1; 178 r.arg[i] = r.arg[i] - w.arg[i]; 179 } 180 } 181 while (r.arg[r.len - 1] == 0 && r.len > 1) 182 r.len--; 183 return r; 184 } 185 friend BigInteger operator-(BigInteger r, int w) 186 { 187 for (int i = 0; i < r.len; i++, w = w / 10){ 188 if (r.arg[i] >= w % 10) 189 r.arg[i] = r.arg[i] - w % 10; 190 else{ 191 r.arg[i] = r.arg[i] + 10; 192 r.arg[i + 1] = r.arg[i + 1] - 1; 193 r.arg[i] = r.arg[i] - w % 10; 194 } 195 } 196 while (r.arg[r.len - 1] == 0 && r.len > 1) 197 r.len--; 198 return r; 199 } 200 friend BigInteger operator*(int x, BigInteger w) 201 { 202 BigInteger r; 203 if(x == 0 || (w.len == 1 && w.arg[0] == 0)){ 204 return r; 205 } 206 for (int i = 0; i < w.len; i++){ 207 r.arg[i] += w.arg[i] * x; 208 r.arg[i + 1] += r.arg[i] / 10; 209 r.arg[i] = r.arg[i] % 10; 210 } 211 int i = r.arg[w.len] == 0 ? w.len-1 : w.len; 212 while (r.arg[i] >= 10){ 213 r.arg[i + 1] = r.arg[i] / 10; 214 r.arg[i] = r.arg[i] % 10; 215 i++; 216 } 217 r.len = (i >= 0) ? i + 1 : 1; 218 return r; 219 } 220 friend BigInteger operator*(BigInteger w, int x) 221 { 222 BigInteger r; 223 if(x == 0 || (w.len == 1 && w.arg[0] == 0)){ 224 return r; 225 } 226 for (int i = 0; i < w.len; i++){ 227 r.arg[i] += w.arg[i] * x; 228 r.arg[i + 1] += r.arg[i] / 10; 229 r.arg[i] = r.arg[i] % 10; 230 } 231 int i = r.arg[w.len] == 0 ? w.len-1 : w.len; 232 while (r.arg[i] >= 10){ 233 r.arg[i + 1] = r.arg[i] / 10; 234 r.arg[i] = r.arg[i] % 10; 235 i++; 236 } 237 r.len = (i >= 0) ? i + 1 : 1; 238 return r; 239 } 240 friend BigInteger operator*(BigInteger r, BigInteger w) 241 { 242 BigInteger v; 243 if((r.len == 1 && r.arg[0] == 0)|| (w.len == 1 && w.arg[0] == 0)){ 244 return v; 245 } 246 for (int i = 0; i < r.len; i++){ 247 for (int k = 0; k < w.len; k++){ 248 v.arg[i + k] += w.arg[k] * r.arg[i]; 249 v.arg[i + k + 1] += v.arg[i + k] / 10; 250 v.arg[i + k] = v.arg[i + k] % 10; 251 } 252 } 253 int i = w.len + r.len - 1; 254 i = v.arg[i] == 0 ? i-1 : i; 255 while (v.arg[i] >= 10){ 256 v.arg[i + 1] = v.arg[i] / 10; 257 v.arg[i] = v.arg[i] % 10; 258 i++; 259 } 260 v.len = (i >= 0) ? i + 1 : 1; 261 return v; 262 } 263 264 friend BigInteger operator/(BigInteger r, int w) 265 { 266 BigInteger h, resl; 267 if(w == 0) return h; 268 for (int i = r.len - 1; i >= 0; i--){ 269 resl = 10 * resl; 270 h = r.arg[i] + (10 * h); 271 while (w <= h){ 272 resl = 1 + resl; 273 h = h - w; 274 } 275 } 276 return resl; 277 } 278 friend BigInteger operator/(BigInteger r, BigInteger w) 279 { 280 BigInteger h, resl; 281 if(w.len == 1 && w.arg[0] == 0) return h; 282 for (int i = r.len - 1; i >= 0; i--){ 283 resl = 10 * resl; 284 h = r.arg[i] + (10 * h); 285 while (w <= h){ 286 resl = 1 + resl; 287 h = h - w; 288 } 289 } 290 return resl; 291 } 292 293 friend BigInteger operator%(BigInteger r, BigInteger w) 294 { 295 BigInteger h; 296 if(w.len == 1 && w.arg[0] == 0) return h; 297 for (int i = r.len - 1; i >= 0; i--){ 298 h = r.arg[i] + (10 * h); 299 while (w <= h){ 300 h = h - w; 301 } 302 } 303 return h; 304 } 305 void sqrt() 306 { 307 BigInteger w, r; 308 w.len = r.len = 0; 309 int lens = len - 1; 310 if(len == 1 && arg[0] == 1) 311 return ; 312 r.arg[r.len++] = arg[lens--]; 313 if (len % 2 == 0) 314 r = arg[lens--] + 10 * r; 315 while (lens >= -1){ 316 int i = 0; 317 while ((i*(i + 20 * w)) <= r){ 318 i++; 319 } 320 i--; 321 if (i == -1 || (r.len == 1 && r.arg[0] == 1)) 322 i = 0; 323 r = r - (i*(i + 20 * w)); 324 w = i + 10 * w; 325 if(lens >= 0){ 326 r = arg[lens--] + 10 * r; 327 r = arg[lens--] + 10 * r; 328 } 329 else 330 lens -= 2; 331 } 332 *this = w; 333 } 334 }; 335 336 337 int main() 338 { 339 // BigInteger x=BigInteger(2); 340 // BigInteger y=BigInteger(3); 341 // BigInteger z=x*y; 342 // z.print(); 343 // print(); 344 int cnt=0; 345 BigInteger x=BigInteger(1); 346 BigInteger y=BigInteger(2); 347 while(cnt<=9) 348 { 349 x=x*y; 350 cnt++; 351 // x.print(); 352 } 353 x.print(); 354 // cout<<x.len<<endl; 355 // x.print(); 356 // int T; 357 // scanf("%d",&T); 358 // while(T--) 359 // { 360 // int q; 361 // scanf("%d",&q); 362 // x.print(); 363 // } 364 return 0; 365 }