1 struct BigInt{
2 static const int MAXLEN = 200;
3 static const int BASE = 10000;
4 static const int WIDTH = 4;
5 int s[MAXLEN/4], size;
6
7 BigInt(const LL num = 0);
8 BigInt & operator=(const LL num);
9 BigInt & operator=(const string &str);
10 BigInt operator+(const BigInt &rhs) const;
11 BigInt operator*(const BigInt &rhs) const;
12 bool read();
13 void print();
14 };
15
16 BigInt::BigInt(const LL num){
17 *this = num;
18 }
19
20 BigInt & BigInt::operator=(LL num){
21 memset(s, 0, sizeof(s));
22 size = 0;
23 do{
24 s[size++] = num % BASE;
25 num /= BASE;
26 }while(num > 0);
27 return *this;
28 }
29
30 BigInt& BigInt::operator=(const string& rhs){
31 memset(s, 0, sizeof(s));
32 size = 0;
33 int x, len = (rhs.length() - 1) / WIDTH + 1;
34 for(int i = 0; i < len; i++){
35 int end= rhs.length() - i * WIDTH;
36 int start = max(0, end - WIDTH);
37 sscanf(rhs.substr(start, end - start).c_str(), "%d", &x);
38 s[size++] = x;
39 }
40 return *this;
41 }
42
43 BigInt BigInt::operator+(const BigInt & rhs) const{
44 BigInt ret;
45 memset(ret.s, 0, sizeof(s));
46 ret.size = 0;
47 for(int i = 0, x = 0; ; i++){
48 if(x == 0 && i >= size && i >= rhs.size) break;
49 if(i < size) x += s[i];
50 if(i < rhs.size) x += rhs.s[i];
51 ret.s[ret.size++] = x % BASE;
52 x /= BASE;
53 }
54 return ret;
55 }
56
57 BigInt BigInt::operator*(const BigInt & rhs)const{
58 BigInt ret;
59 memset(ret.s, 0, sizeof(s));
60 ret.size = 0;
61 for(int i = 0; i < size; i++){
62 int carry = 0;
63 for(int j = 0; j < rhs.size; j++){
64 ret.s[i + j] += s[i] * rhs.s[j] + carry;
65 if(ret.s[i + j] >= BASE){
66 carry = ret.s[i + j] / BASE;
67 ret.s[i + j] %= BASE;
68 }
69 else carry = 0;
70 }
71 if(carry){
72 ret.s[i + rhs.size] = carry;
73 }
74 }
75 while(ret.s[ret.size - 1] == 0 && ret.size > 1)
76 ret.size--;
77 return ret;
78 }
79
80 bool BigInt::read(){
81 char buf[MAXLEN];
82 if(scanf("%s", buf) == EOF)
83 return false;
84 string s(buf);
85 *this = s;
86 return true;
87 }
88
89 void BigInt::print(){
90 printf("%d", s[size - 1]);
91 for(int i = size - 2; i >= 0; i--){
92 printf("%04d", s[i]);
93 }
94 }