首页 > 代码库 > 高精度模板
高精度模板
#ifndef BIGNUM#define BIGNUMclass BigNum {#define MAXSIZEOFBIGNUM 500#define BASE 10#define DLEN 1public: int Len; int d[MAXSIZEOFBIGNUM];public: BigNum(void); BigNum(const int); BigNum(const char *); BigNum(const BigNum &); BigNum & operator = (const BigNum &); void clear(void); friend istream& operator>>(istream&, BigNum&); friend ostream& operator<<(ostream&, BigNum&); bool operator == (const BigNum &) const; bool operator > (const BigNum &) const; bool operator < (const BigNum &) const; bool operator >= (const BigNum &) const; bool operator <= (const BigNum &) const; BigNum operator + (const BigNum &) const; BigNum operator - (const BigNum &) const; BigNum operator * (const BigNum &) const; BigNum operator / (const BigNum &) const; BigNum operator % (const BigNum &) const; void operator ++ (void); void operator -- (void); BigNum operator + (const int &) const; BigNum operator - (const int &) const; BigNum operator * (const int &) const; BigNum operator / (const int &) const; int operator % (const int &) const; BigNum operator ^ (const int &) const; ~BigNum() {}};BigNum::BigNum() { Len = 0; memset(d, 0, sizeof(d));}BigNum::BigNum(const int ops) { int x = ops; Len = 0; memset(d, 0, sizeof(d)); while(x) { Len++; d[Len] = x % BASE; x /= BASE; }}BigNum::BigNum(const char * ops) { int L = strlen(ops) - 1, b = 0; memset(d, 0, sizeof(d)); while(ops[b] == ‘0‘) { b++; } Len = 0; while(L - b + 1 >= DLEN) { int x = 0; for(int i = L - DLEN + 1; i <= L; i++) { x = x * 10 + ops[i] - ‘0‘; } Len++; d[Len] = x; L -= DLEN; } int x = 0; for(int i = b; i <= L; i++) { x = x * 10 + ops[i] - ‘0‘; } Len++; d[Len] = x;}BigNum::BigNum(const BigNum &ops) : Len(ops.Len) { memset(d, 0, sizeof(d)); for(int i = 1; i <= Len; i++) { d[i] = ops.d[i]; }}BigNum & BigNum::operator = (const BigNum &ops) { memset(d, 0, sizeof(d)); Len = ops.Len; for(int i = 1; i <= Len; i++) { d[i] = ops.d[i]; } return *this;}void BigNum::clear(void) { for(int i = 1; i <= MAXSIZEOFBIGNUM - 2; i++) { if(d[i] < 0) { d[i] += BASE; d[i + 1]--; } if(d[i] >= BASE) { d[i] -= BASE; d[i + 1]++; } } for(int i = MAXSIZEOFBIGNUM - 1; i >= 1; i--) if(d[i] > 0) { Len = i; return; } Len = 0;}istream& operator>>(istream &in, BigNum &ops) { char str[MAXSIZEOFBIGNUM + 100]; in >> str; int L = strlen(str), b = 0; while(str[b] == ‘0‘) { b++; } ops.Len = 0; for(int i = L - 1; i >= b; i--) { ops.Len++; ops.d[ops.Len] = str[i] - ‘0‘; } return in;}ostream& operator<<(ostream& out, BigNum& ops) { for(int i = ops.Len; i >= 1; i--) { out << ops.d[i]; } if(ops.Len == 0) { out << "0"; } return out;}bool BigNum::operator == (const BigNum &ops) const { if(Len != ops.Len) { return false; } for(int i = Len; i >= 1; i--) if(d[i] != ops.d[i]) { return false; } return true;}bool BigNum::operator > (const BigNum &ops) const { if(Len < ops.Len) { return false; } else if(Len > ops.Len) { return true; } else { for(int i = Len; i >= 1; i--) if(d[i] < ops.d[i]) { return false; } else if(d[i] > ops.d[i]) { return true; } } return false;}bool BigNum::operator < (const BigNum &ops) const { if(Len < ops.Len) { return true; } else if(Len > ops.Len) { return false; } else { for(int i = Len; i >= 1; i--) if(d[i] < ops.d[i]) { return true; } else if(d[i] > ops.d[i]) { return false; } } return false;}bool BigNum::operator >= (const BigNum &ops) const { if(Len < ops.Len) { return false; } else if(Len > ops.Len) { return true; } else { for(int i = Len; i >= 1; i--) if(d[i] < ops.d[i]) { return false; } else if(d[i] > ops.d[i]) { return true; } } return true;}bool BigNum::operator <= (const BigNum &ops) const { if(Len < ops.Len) { return true; } else if(Len > ops.Len) { return false; } else { for(int i = Len; i >= 1; i--) if(d[i] < ops.d[i]) { return true; } else if(d[i] > ops.d[i]) { return false; } } return true;}BigNum BigNum::operator + (const BigNum &ops) const { BigNum ret(*this); for(int i = 1; i <= ops.Len; i++) { ret.d[i] += ops.d[i]; } ret.clear(); return ret;}BigNum BigNum::operator - (const BigNum &ops) const { BigNum ret(*this); for(int i = ops.Len; i >= 1; i--) { ret.d[i] -= ops.d[i]; } ret.clear(); return ret;}BigNum BigNum::operator * (const BigNum &ops) const { BigNum ret, now(*this); for(int i = 1; i <= now.Len; i++) for(int j = 1; j <= ops.Len; j++) { ret.d[i + j - 1] += now.d[i] * ops.d[j]; } for(int i = 1; i <= MAXSIZEOFBIGNUM - 2; i++) if(ret.d[i] >= BASE) { ret.d[i + 1] += ret.d[i] / BASE; ret.d[i] %= BASE; } for(int i = MAXSIZEOFBIGNUM - 1; i >= 1; i--) if(ret.d[i] > 0) { ret.Len = i; break; } return ret;}BigNum BigNum::operator / (const BigNum &ops) const { BigNum now = (*this), div, mod; div.Len = now.Len; mod.Len = 0; for(int j = now.Len; j >= 1; j--) { mod.Len++; for(int p = mod.Len; p >= 2; p--) { mod.d[p] = mod.d[p - 1]; } mod.d[1] = now.d[j]; while(mod >= ops) { div.d[j]++; mod = mod - ops; } if(mod.Len == 1 && mod.d[1] == 0) { mod.Len--; } } div.clear(); mod.clear(); return div;}BigNum BigNum::operator % (const BigNum &ops) const { BigNum now = (*this), div, mod; div.Len = now.Len; mod.Len = 0; for(int j = now.Len; j >= 1; j--) { mod.Len++; for(int p = mod.Len; p >= 2; p--) { mod.d[p] = mod.d[p - 1]; } mod.d[1] = now.d[j]; while(mod >= ops) { div.d[j]++; mod = mod - ops; } if(mod.Len == 1 && mod.d[1] == 0) { mod.Len--; } } div.clear(); mod.clear(); return mod;}void BigNum::operator ++ (void) { d[1]++; for(int i = 1; i <= MAXSIZEOFBIGNUM - 2; i++) if(d[i] >= BASE) { d[i] -= BASE; d[i + 1]++; } else { break; } if(d[Len + 1] > 0) { Len++; }}void BigNum::operator -- (void) { d[1]--; for(int i = 1; i <= MAXSIZEOFBIGNUM - 2; i++) if(d[i] < 0) { d[i] += BASE; d[i + 1]--; } else { break; } if(d[Len] == 0) { Len--; }}BigNum BigNum::operator + (const int & ops) const { BigNum ret = (*this); ret.d[1] += ops; ret.clear(); return ret;}BigNum BigNum::operator - (const int & ops) const { BigNum ret = (*this); ret.d[1] -= ops; ret.clear(); return ret;}BigNum BigNum::operator * (const int & ops) const { BigNum ret(*this); for(int i = 1; i <= ret.Len; i++) { ret.d[i] *= ops; } for(int i = 1; i <= MAXSIZEOFBIGNUM - 2; i++) if(ret.d[i] >= BASE) { ret.d[i + 1] += ret.d[i] / BASE; ret.d[i] %= BASE; } for(int i = MAXSIZEOFBIGNUM - 1; i >= 1; i--) if(ret.d[i] > 0) { ret.Len = i; return ret; } ret.Len = 0; return ret;}BigNum BigNum::operator / (const int & ops) const { BigNum ret; int down = 0; for(int i = Len; i >= 1; i--) { ret.d[i] = (d[i] + down * BASE) / ops; down = d[i] + down * BASE - ret.d[i] * ops; } ret.Len = Len; while(ret.d[ret.Len] == 0 && ret.Len > 1) { ret.Len--; } return ret;}int BigNum::operator % (const int &ops) const { int mod = 0; for(int i = Len; i >= 1; i--) { mod = ((mod * BASE) % ops + d[i]) % ops; } return mod;}BigNum BigNum::operator ^ (const int &ops) const { BigNum t, ret(1); if(ops == 0) { return ret; } if(ops == 1) { return *this; } int m = ops, i; while(m > 1) { t = *this; for(i = 1; (i << 1) <= m; i <<= 1) { t = t * t; } m -= i; ret = ret * t; if(m == 1) { ret = ret * (*this); } } return ret;}#endif
MAXSIZEOFBIGNUM:数字的位数
BASE:进制
高精度模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。