优秀大整数
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 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。