优秀大整数

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3   
  4 struct BigInteger
  5 {
  6     static const int BASE = 100000000; //和WIDTH保持一致
  7     static const int WIDTH = 8;        //八位一存储,如修改记得修改输出中的%08d
  8     bool sign;                         //符号, 0表示负数
  9     size_t length;                     //位数
 10     vector<int> num;                   //反序存
 11     //构造函数
 12     BigInteger(long long x = 0) { *this = x; }
 13     BigInteger(const string &x) { *this = x; }
 14     BigInteger(const BigInteger &x) { *this = x; }
 15     //剪掉前导0,并且求一下数的位数
 16     void cutLeadingZero()
 17     {
 18         while (num.back() == 0 && num.size() != 1)
 19         {
 20             num.pop_back();
 21         }
 22         int tmp = num.back();
 23         if (tmp == 0)
 24         {
 25             length = 1;
 26         }
 27         else
 28         {
 29             length = (num.size() - 1) * WIDTH;
 30             while (tmp > 0)
 31             {
 32                 length++;
 33                 tmp /= 10;
 34             }
 35         }
 36     }
 37     //赋值运算符
 38     BigInteger &operator=(long long x)
 39     {
 40         num.clear();
 41         if (x >= 0)
 42         {
 43             sign = true;
 44         }
 45         else
 46         {
 47             sign = false;
 48             x = -x;
 49         }
 50         do
 51         {
 52             num.push_back(x % BASE);
 53             x /= BASE;
 54         } while (x > 0);
 55         cutLeadingZero();
 56         return *this;
 57     }
 58     BigInteger &operator=(const string &str)
 59     {
 60         num.clear();
 61         sign = (str[0] != '-'); //设置符号
 62         int x, len = (str.size() - 1 - (!sign)) / WIDTH + 1;
 63         for (int i = 0; i < len; i++)
 64         {
 65             int End = str.size() - i * WIDTH;
 66             int start = max((int)(!sign), End - WIDTH); //防止越界
 67             sscanf(str.substr(start, End - start).c_str(), "%d", &x);
 68             num.push_back(x);
 69         }
 70         cutLeadingZero();
 71         return *this;
 72     }
 73     BigInteger &operator=(const BigInteger &tmp)
 74     {
 75         num = tmp.num;
 76         sign = tmp.sign;
 77         length = tmp.length;
 78         return *this;
 79     }
 80     //绝对值
 81     BigInteger abs() const
 82     {
 83         BigInteger ans(*this);
 84         ans.sign = true;
 85         return ans;
 86     }
 87     //正号
 88     const BigInteger &operator+() const { return *this; }
 89     //负号
 90     BigInteger operator-() const
 91     {
 92         BigInteger ans(*this);
 93         if (ans != 0)
 94             ans.sign = !ans.sign;
 95         return ans;
 96     }
 97     // + 运算符
 98     BigInteger operator+(const BigInteger &b) const
 99     {
100         if (!b.sign)
101         {
102             return *this - (-b);
103         }
104         if (!sign)
105         {
106             return b - (-*this);
107         }
108         BigInteger ans;
109         ans.num.clear();
110         for (int i = 0, g = 0;; i++)
111         {
112             if (g == 0 && i >= num.size() && i >= b.num.size())
113                 break;
114             int x = g;
115             if (i < num.size())
116                 x += num[i];
117             if (i < b.num.size())
118                 x += b.num[i];
119             ans.num.push_back(x % BASE);
120             g = x / BASE;
121         }
122         ans.cutLeadingZero();
123         return ans;
124     }
125     // - 运算符
126     BigInteger operator-(const BigInteger &b) const
127     {
128         if (!b.sign)
129         {
130             return *this + (-b);
131         }
132         if (!sign)
133         {
134             return -((-*this) + b);
135         }
136         if (*this < b)
137         {
138             return -(b - *this);
139         }
140         BigInteger ans;
141         ans.num.clear();
142         for (int i = 0, g = 0;; i++)
143         {
144             if (g == 0 && i >= num.size() && i >= b.num.size())
145                 break;
146             int x = g;
147             g = 0;
148             if (i < num.size())
149                 x += num[i];
150             if (i < b.num.size())
151                 x -= b.num[i];
152             if (x < 0)
153             {
154                 x += BASE;
155                 g = -1;
156             }
157             ans.num.push_back(x);
158         }
159         ans.cutLeadingZero();
160         return ans;
161     }
162     // * 运算符
163     BigInteger operator*(const BigInteger &b) const
164     {
165         int lena = num.size(), lenb = b.num.size();
166         BigInteger ans;
167         for (int i = 0; i < lena + lenb; i++)
168             ans.num.push_back(0);
169         for (int i = 0, g = 0; i < lena; i++)
170         {
171             g = 0;
172             for (int j = 0; j < lenb; j++)
173             {
174                 long long x = ans.num[i + j];
175                 x += (long long)num[i] * (long long)b.num[j];
176                 ans.num[i + j] = x % BASE;
177                 g = x / BASE;
178                 ans.num[i + j + 1] += g;
179             }
180         }
181         ans.cutLeadingZero();
182         ans.sign = (ans.length == 1 && ans.num[0] == 0) || (sign == b.sign);
183         return ans;
184     }
185     //*10^n 大数除大数中用到
186     BigInteger e(size_t n) const
187     {
188         int tmp = n % WIDTH;
189         BigInteger ans;
190         ans.length = n + 1;
191         n /= WIDTH;
192         while (ans.num.size() <= n)
193             ans.num.push_back(0);
194         ans.num[n] = 1;
195         while (tmp--)
196             ans.num[n] *= 10;
197         return ans * (*this);
198     }
199     // /运算符 (大数除大数)
200     BigInteger operator/(const BigInteger &b) const
201     {
202         BigInteger aa((*this).abs());
203         BigInteger bb(b.abs());
204         if (aa < bb)
205             return 0;
206         char *str = new char[aa.length + 1];
207         memset(str, 0, sizeof(char) * (aa.length + 1));
208         BigInteger tmp;
209         int lena = aa.length, lenb = bb.length;
210         for (int i = 0; i <= lena - lenb; i++)
211         {
212             tmp = bb.e(lena - lenb - i);
213             while (aa >= tmp)
214             {
215                 str[i]++;
216                 aa = aa - tmp;
217             }
218             str[i] += '0';
219         }
220         BigInteger ans(str);
221         delete[] str;
222         ans.sign = (ans == 0 || sign == b.sign);
223         return ans;
224     }
225     // %运算符
226     BigInteger operator%(const BigInteger &b) const
227     {
228         return *this - *this / b * b;
229     }
230     // ++ 运算符
231     BigInteger &operator++()
232     {
233         *this = *this + 1;
234         return *this;
235     }
236     // -- 运算符
237     BigInteger &operator--()
238     {
239         *this = *this - 1;
240         return *this;
241     }
242     // += 运算符
243     BigInteger &operator+=(const BigInteger &b)
244     {
245         *this = *this + b;
246         return *this;
247     }
248     // -= 运算符
249     BigInteger &operator-=(const BigInteger &b)
250     {
251         *this = *this - b;
252         return *this;
253     }
254     // *=运算符
255     BigInteger &operator*=(const BigInteger &b)
256     {
257         *this = *this * b;
258         return *this;
259     }
260     // /= 运算符
261     BigInteger &operator/=(const BigInteger &b)
262     {
263         *this = *this / b;
264         return *this;
265     }
266     // %=运算符
267     BigInteger &operator%=(const BigInteger &b)
268     {
269         *this = *this % b;
270         return *this;
271     }
272     // < 运算符
273     bool operator<(const BigInteger &b) const
274     {
275         if (sign != b.sign) //正负,负正
276         {
277             return !sign;
278         }
279         else if (!sign && !b.sign) //负负
280         {
281             return -b < -*this;
282         }
283         //正正
284         if (num.size() != b.num.size())
285             return num.size() < b.num.size();
286         for (int i = num.size() - 1; i >= 0; i--)
287             if (num[i] != b.num[i])
288                 return num[i] < b.num[i];
289         return false;
290     }
291     bool operator>(const BigInteger &b) const { return b < *this; }                     // >  运算符
292     bool operator<=(const BigInteger &b) const { return !(b < *this); }                 // <= 运算符
293     bool operator>=(const BigInteger &b) const { return !(*this < b); }                 // >= 运算符
294     bool operator!=(const BigInteger &b) const { return b < *this || *this < b; }       // != 运算符
295     bool operator==(const BigInteger &b) const { return !(b < *this) && !(*this < b); } //==运算符
296     // 逻辑运算符
297     bool operator||(const BigInteger &b) const { return *this != 0 || b != 0; } // || 运算符
298     bool operator&&(const BigInteger &b) const { return *this != 0 && b != 0; } // && 运算符
299     bool operator!() { return (bool)(*this == 0); }                             // ! 运算符
300    
301     //重载<<使得可以直接输出大数
302     friend ostream &operator<<(ostream &out, const BigInteger &x)
303     {
304         if (!x.sign)
305             out << '-';
306         out << x.num.back();
307         for (int i = x.num.size() - 2; i >= 0; i--)
308         {
309             char buf[10];
310             //如WIDTH和BASR有变化,此处要修改为%0(WIDTH)d
311             sprintf(buf, "%08d", x.num[i]);
312             for (int j = 0; j < strlen(buf); j++)
313                 out << buf[j];
314         }
315         return out;
316     }
317     //重载>>使得可以直接输入大数
318     friend istream &operator>>(istream &in, BigInteger &x)
319     {
320         string str;
321         in >> str;
322         size_t len = str.size();
323         int start = 0;
324         if (str[0] == '-')
325             start = 1;
326         if (str[start] == '\0')
327             return in;
328         for (int i = start; i < len; i++)
329         {
330             if (str[i] < '0' || str[i] > '9')
331                 return in;
332         }
333         x.sign = !start;
334         x = str.c_str();
335         return in;
336     }
337 };
338   
339 typedef BigInteger Int;
340   
341 int main()
342 {
343     Int ans, a = 2, b;
344     int t; scanf("%d", &t);
345     for(; t--; ) {
346         cin >> b;
347         a = 2; ans = 1;
348         for(; b != 0; b /= 2, a *= a)
349              if(b %2 == 1) ans *= a;
350         cout << ans << '\n';
351     }
352     return 0;
353 }

 

posted @ 2019-11-30 11:22  Aptal丶  阅读(210)  评论(1编辑  收藏  举报