标签:style blog color io os 使用 ar for sp
之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多。
实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验。
话不多说,贴代码。
1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 5 #define MAXBIT 1007 6 #define BITTYPE int 7 8 class BigInt { 9 private: 10 BITTYPE bit[MAXBIT]; 11 bool negative;//负数标志 12 13 public: 14 BigInt(); //默认构造函数,值为0 15 BigInt(const int); //构造函数 16 BigInt(const char *); //构造函数 17 BigInt(const BigInt &); //复制构造函数 18 19 /*重载赋值运算符*/ 20 BigInt& operator=(const BigInt&); 21 BigInt& operator=(const int ); 22 23 /*重载算数运算符*/ 24 BigInt operator+(const BigInt& )const; 25 BigInt operator+(const int )const; 26 BigInt operator-(const BigInt& )const; 27 BigInt operator-(const int )const; 28 BigInt operator*(const BigInt& )const; 29 BigInt operator*(const int )const; 30 BigInt operator/(const int )const; 31 int operator%(const int )const; 32 33 /*重载比较运算符*/ 34 bool operator>(const BigInt& )const; 35 bool operator>(const int )const; 36 bool operator>=(const BigInt& )const; 37 bool operator>=(const int )const; 38 bool operator<(const BigInt& )const; 39 bool operator<(const int )const; 40 bool operator<=(const BigInt& )const; 41 bool operator<=(const int )const; 42 bool operator==(const BigInt& )const; 43 bool operator==(const int )const; 44 bool operator!=(const BigInt& )const; 45 bool operator!=(const int )const; 46 47 void print() const;//输出数值 48 bool isZero() const;//是否为0 49 bool isPositive() const;//是否为正数 50 bool isNegative() const;//是否为负数 51 bool nonNegative() const;//是否为非负数 52 53 //private: 54 BigInt opposite()const;//取相反数 55 BigInt absoluteAdd(const BigInt&)const;//加上绝对值 56 BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值 57 bool absoluteEqual(const BigInt&)const;//绝对值等于 58 bool absoluteGreater(const BigInt&)const;//绝对值大于 59 bool absoluteEqualGreater(const BigInt&)const;//绝对值大于等于 60 }; 61 62 BigInt::BigInt() 63 { 64 memset(bit,0,sizeof(bit)); 65 negative = false; 66 } 67 68 BigInt::BigInt(const int n) 69 { 70 memset(bit,0,sizeof(bit)); 71 int nn = n; 72 if (nn>=0) negative = false; 73 else { 74 negative = true; 75 nn = -nn; 76 } 77 int pos = 0; 78 while (nn) { 79 bit[pos++] = nn % 10; 80 nn /= 10; 81 } 82 } 83 84 BigInt::BigInt(const char *s) 85 { 86 int len = strlen(s); 87 bool valid = true;//符合数字格式 88 if (len >= 2) { 89 if (s[0]!=‘+‘ && s[0]!=‘-‘ && !isdigit(s[0])) valid = false; 90 for (int i=1; i<len; ++i) { 91 if (!isdigit(s[i])) valid = false; 92 } 93 } 94 else if (len == 1) { 95 if (!isdigit(s[0])) valid = false; 96 } 97 if (len==0 || !valid) { 98 memset(bit,0,sizeof(bit)); 99 negative = false; 100 return; 101 } 102 int beg = 0, end = len-1; 103 if (s[0] == ‘+‘) { 104 negative = false; 105 ++beg; 106 } 107 else if (s[0] == ‘-‘) { 108 bool zeroFlag = true; 109 for (int i=1; i<len; ++i) { 110 if (s[i]!=‘0‘) { 111 zeroFlag = false; 112 break; 113 } 114 } 115 if (zeroFlag) negative = false; 116 else negative = true; 117 ++beg; 118 } 119 else negative = false; 120 memset(bit,0,sizeof(bit)); 121 for (int i=beg; i<=end; ++i) { 122 bit[len-1-i] = s[i] - ‘0‘; 123 } 124 } 125 126 BigInt::BigInt(const BigInt& n) 127 { 128 memcpy(bit,n.bit,sizeof(bit)); 129 negative = n.negative; 130 } 131 132 BigInt& BigInt::operator=(const BigInt& n) 133 { 134 memcpy(bit,n.bit,sizeof(bit)); 135 negative = n.negative; 136 return *this; 137 } 138 139 BigInt& BigInt::operator=(const int n) 140 { 141 return *this = BigInt(n); 142 } 143 144 BigInt BigInt::operator+(const BigInt& n)const 145 { 146 if ((!negative && !n.negative) || (negative && n.negative)) { 147 return this->absoluteAdd(n); 148 } 149 else { 150 if (absoluteEqual(n)) return BigInt(); 151 else if (absoluteEqualGreater(n)) return this->absoluteMinus(n); 152 else return n.absoluteMinus(*this); 153 } 154 } 155 156 BigInt BigInt::operator+(const int n)const 157 { 158 return *this + BigInt(n); 159 } 160 161 BigInt BigInt::operator-(const BigInt& n)const 162 { 163 return *this + n.opposite(); 164 } 165 166 BigInt BigInt::operator-(const int n)const 167 { 168 return *this - BigInt(n); 169 } 170 171 BigInt BigInt::operator*(const BigInt& n)const 172 { 173 if (isZero() || n.isZero()) return BigInt(); 174 BigInt bi = BigInt(); 175 if ((!negative && !n.negative) || (negative && n.negative)) { 176 bi.negative = false; 177 } 178 else bi.negative = true; 179 for (int i=0; i<MAXBIT; ++i) for (int j=0; j<MAXBIT-i; ++j) { 180 bi.bit[i+j] += bit[i] * n.bit[j]; 181 } 182 for (int i=0; i<MAXBIT-1; ++i) {//进位 183 bi.bit[i+1] += bi.bit[i] / 10; 184 bi.bit[i] %= 10; 185 } 186 return bi; 187 } 188 189 BigInt BigInt::operator*(const int n)const 190 { 191 return *this * BigInt(n); 192 } 193 194 BigInt BigInt::operator/(const int n)const 195 {//除以0直接返回0 196 if (isZero() || n==0) return BigInt(); 197 BigInt bi = BigInt(); 198 if ((!negative && n>0) || (negative && n<0)) { 199 bi.negative = false; 200 } 201 else bi.negative = true; 202 int div = 0;//累计除数 203 for (int i=MAXBIT-1; i>=0; --i) { 204 div = div * 10 + bit[i]; 205 bi.bit[i] = div / n; 206 div %= n; 207 } 208 return bi; 209 } 210 211 int BigInt::operator%(const int n)const 212 { 213 int mod = 0;//累计余数 214 for (int i=MAXBIT-1; i>=0; --i) { 215 //mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n; 216 mod = ((mod*10) + bit[i]) % n; 217 } 218 return mod; 219 } 220 221 bool BigInt::operator>(const BigInt& n)const 222 { 223 if (!negative && n.negative) return true; 224 else if (negative && !n.negative) return false; 225 else if (!negative && !n.negative) return absoluteGreater(n); 226 else return n.absoluteGreater(*this); 227 } 228 229 bool BigInt::operator>(const int n)const 230 { 231 return *this > BigInt(n); 232 } 233 234 bool BigInt::operator>=(const BigInt& n)const 235 { 236 if (!negative && n.negative) return true; 237 else if (negative && !n.negative) return false; 238 else if (!negative && !n.negative) return absoluteEqualGreater(n); 239 else return n.absoluteEqualGreater(*this); 240 } 241 242 bool BigInt::operator>=(const int n)const 243 { 244 return *this >= BigInt(n); 245 } 246 247 bool BigInt::operator<(const BigInt& n)const 248 { 249 return n > *this; 250 } 251 252 bool BigInt::operator<(const int n)const 253 { 254 return *this < BigInt(n); 255 } 256 257 bool BigInt::operator<=(const BigInt& n)const 258 { 259 return n >= *this; 260 } 261 262 bool BigInt::operator<=(const int n)const 263 { 264 return *this <= BigInt(n); 265 } 266 267 bool BigInt::operator==(const BigInt& n)const 268 { 269 if (negative != n.negative) return false; 270 for (int i=0; i<MAXBIT; ++i) { 271 if (bit[i] != n.bit[i]) return false; 272 } 273 return true; 274 } 275 276 bool BigInt::operator==(const int n)const 277 { 278 return *this == BigInt(n); 279 } 280 281 bool BigInt::operator!=(const BigInt& n)const 282 { 283 if (negative != n.negative) return true; 284 for (int i=0; i<MAXBIT; ++i) { 285 if (bit[i] != n.bit[i]) return true; 286 } 287 return false; 288 } 289 290 bool BigInt::operator!=(const int n)const 291 { 292 return *this != BigInt(n); 293 } 294 295 void BigInt::print()const 296 { 297 if (negative) printf("-"); 298 int pos = MAXBIT - 1; 299 for (; pos>0; --pos) { 300 if (bit[pos]) break; 301 } 302 for (int i=pos; i>=0; --i) printf("%d",bit[i]); 303 } 304 305 bool BigInt::isZero()const 306 { 307 bool zeroFlag = true; 308 for (int i=0; i<MAXBIT; ++i) { 309 if (bit[i] != 0) { 310 zeroFlag = false; 311 break; 312 } 313 } 314 return zeroFlag; 315 } 316 317 bool BigInt::isPositive()const 318 { 319 return !negative && !isZero(); 320 } 321 322 bool BigInt::isNegative()const 323 { 324 return negative; 325 } 326 327 bool BigInt::nonNegative()const 328 { 329 return !negative; 330 } 331 332 BigInt BigInt::opposite()const 333 { 334 BigInt n(*this); 335 if (!n.isZero()) n.negative = !n.negative; 336 return n; 337 } 338 339 BigInt BigInt::absoluteAdd(const BigInt& n)const 340 { 341 BigInt bi(*this); 342 int next = 0;//进位 343 for (int i=0; i<MAXBIT; ++i) { 344 bi.bit[i] = (bit[i] + n.bit[i] + next) % 10; 345 next = (bit[i] + n.bit[i] + next) / 10; 346 } 347 return bi; 348 } 349 350 BigInt BigInt::absoluteMinus(const BigInt& n)const 351 { 352 BigInt bi(*this); 353 for (int i=MAXBIT-1; i>=0; --i) { 354 if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i]; 355 else {//借位 356 int borrow = i + 1;//借位位 357 while (bi.bit[borrow]==0) ++borrow; 358 --bi.bit[borrow]; 359 for (int j=i+1; j<borrow; ++j) bi.bit[j] = 9; 360 bi.bit[i] = bi.bit[i] + 10 - n.bit[i]; 361 } 362 } 363 return bi; 364 } 365 366 bool BigInt::absoluteEqual(const BigInt& n)const 367 { 368 for (int i=0; i<MAXBIT; ++i) { 369 if (bit[i] != n.bit[i]) return false; 370 } 371 return true; 372 } 373 374 bool BigInt::absoluteGreater(const BigInt& n)const 375 { 376 for (int i=MAXBIT-1; i>=0; --i) { 377 if (bit[i]>n.bit[i]) return true; 378 else if (bit[i]<n.bit[i]) return false; 379 } 380 return false; 381 } 382 383 bool BigInt::absoluteEqualGreater(const BigInt& n)const 384 { 385 for (int i=MAXBIT-1; i>=0; --i) { 386 if (bit[i]>n.bit[i]) return true; 387 else if (bit[i]<n.bit[i]) return false; 388 } 389 return true; 390 }
模板写成后特地去poj刷了大数相加和大数相乘两道水题,一次ac的满足感可是刚刚的~
欢迎大家参考,测试,批评指正bug和不足之处,感谢~
标签:style blog color io os 使用 ar for sp
原文地址:http://www.cnblogs.com/huanglianjing/p/4002872.html