之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多。
实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验。
话不多说,贴代码。
/*BigInt.h*/
#include <stdio.h> #include <string.h> #include <ctype.h> #define MAXBIT 1007 #define BITTYPE int class BigInt { private: BITTYPE bit[MAXBIT]; bool negative;//负数标志 public: BigInt(); //默认构造函数,值为0 BigInt(const int); //构造函数 BigInt(const char *); //构造函数 BigInt(const BigInt &); //复制构造函数 /*重载赋值运算符*/ BigInt& operator=(const BigInt&); BigInt& operator=(const int ); /*重载算数运算符*/ BigInt operator+(const BigInt& )const; BigInt operator+(const int )const; BigInt operator-(const BigInt& )const; BigInt operator-(const int )const; BigInt operator*(const BigInt& )const; BigInt operator*(const int )const; BigInt operator/(const int )const; int operator%(const int )const; /*重载比较运算符*/ bool operator>(const BigInt& )const; bool operator>(const int )const; bool operator>=(const BigInt& )const; bool operator>=(const int )const; bool operator<(const BigInt& )const; bool operator<(const int )const; bool operator<=(const BigInt& )const; bool operator<=(const int )const; bool operator==(const BigInt& )const; bool operator==(const int )const; bool operator!=(const BigInt& )const; bool operator!=(const int )const; void print() const;//输出数值 bool isZero() const;//是否为0 bool isPositive() const;//是否为正数 bool isNegative() const;//是否为负数 bool nonNegative() const;//是否为非负数 private: BigInt opposite()const;//取相反数 BigInt absoluteAdd(const BigInt&)const;//加上绝对值 BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值 bool absoluteEqual(const BigInt&)const;//绝对值等于 bool absoluteGreater(const BigInt&)const;//绝对值大于 bool absoluteEqualGreater(const BigInt&)const;//绝对值大于等于 }; BigInt::BigInt() { memset(bit,,sizeof(bit)); negative = false; } BigInt::BigInt(const int n) { memset(bit,,sizeof(bit)); int nn = n; ) negative = false; else { negative = true; nn = -nn; } ; while (nn) { bit[pos++] = nn % ; nn /= ; } } BigInt::BigInt(const char *s) { int len = strlen(s); bool valid = true;//符合数字格式 ) { ]!=]!=])) valid = false; ; i<len; ++i) { if (!isdigit(s[i])) valid = false; } } ) { ])) valid = false; } || !valid) { memset(bit,,sizeof(bit)); negative = false; return; } , end = len-; ] == '+') { negative = false; ++beg; } ] == '-') { bool zeroFlag = true; ; i<len; ++i) { ') { zeroFlag = false; break; } } if (zeroFlag) negative = false; else negative = true; ++beg; } else negative = false; memset(bit,,sizeof(bit)); for (int i=beg; i<=end; ++i) { bit[len--i] = s[i] - '; } } BigInt::BigInt(const BigInt& n) { memcpy(bit,n.bit,sizeof(bit)); negative = n.negative; } BigInt& BigInt::operator=(const BigInt& n) { memcpy(bit,n.bit,sizeof(bit)); negative = n.negative; return *this; } BigInt& BigInt::operator=(const int n) { return *this = BigInt(n); } BigInt BigInt::operator+(const BigInt& n)const { if ((!negative && !n.negative) || (negative && n.negative)) { return this->absoluteAdd(n); } else { if (absoluteEqual(n)) return BigInt(); else if (absoluteEqualGreater(n)) return this->absoluteMinus(n); else return n.absoluteMinus(*this); } } BigInt BigInt::operator+(const int n)const { return *this + BigInt(n); } BigInt BigInt::operator-(const BigInt& n)const { return *this + n.opposite(); } BigInt BigInt::operator-(const int n)const { return *this - BigInt(n); } BigInt BigInt::operator*(const BigInt& n)const { if (isZero() || n.isZero()) return BigInt(); BigInt bi = BigInt(); if ((!negative && !n.negative) || (negative && n.negative)) { bi.negative = false; } else bi.negative = true; ; i<MAXBIT; ++i) ; j<MAXBIT-i; ++j) { bi.bit[i+j] += bit[i] * n.bit[j]; } ; i<MAXBIT-; ++i) {//进位 bi.bit[i+] += bi.bit[i] / ; bi.bit[i] %= ; } return bi; } BigInt BigInt::operator*(const int n)const { return *this * BigInt(n); } BigInt BigInt::operator/(const int n)const {//除以0直接返回0 ) return BigInt(); BigInt bi = BigInt(); ) || (negative && n<)) { bi.negative = false; } else bi.negative = true; ;//累计除数 ; i>=; --i) { div = div * + bit[i]; bi.bit[i] = div / n; div %= n; } return bi; } int BigInt::operator%(const int n)const { ;//累计余数 ; i>=; --i) { //mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n; mod = ((mod*) + bit[i]) % n; } return mod; } bool BigInt::operator>(const BigInt& n)const { if (!negative && n.negative) return true; else if (negative && !n.negative) return false; else if (!negative && !n.negative) return absoluteGreater(n); else return n.absoluteGreater(*this); } bool BigInt::operator>(const int n)const { return *this > BigInt(n); } bool BigInt::operator>=(const BigInt& n)const { if (!negative && n.negative) return true; else if (negative && !n.negative) return false; else if (!negative && !n.negative) return absoluteEqualGreater(n); else return n.absoluteEqualGreater(*this); } bool BigInt::operator>=(const int n)const { return *this >= BigInt(n); } bool BigInt::operator<(const BigInt& n)const { return n > *this; } bool BigInt::operator<(const int n)const { return *this < BigInt(n); } bool BigInt::operator<=(const BigInt& n)const { return n >= *this; } bool BigInt::operator<=(const int n)const { return *this <= BigInt(n); } bool BigInt::operator==(const BigInt& n)const { if (negative != n.negative) return false; ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return false; } return true; } bool BigInt::operator==(const int n)const { return *this == BigInt(n); } bool BigInt::operator!=(const BigInt& n)const { if (negative != n.negative) return true; ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return true; } return false; } bool BigInt::operator!=(const int n)const { return *this != BigInt(n); } void BigInt::print()const { if (negative) printf("-"); ; ; --pos) { if (bit[pos]) break; } ; --i) printf("%d",bit[i]); } bool BigInt::isZero()const { bool zeroFlag = true; ; i<MAXBIT; ++i) { ) { zeroFlag = false; break; } } return zeroFlag; } bool BigInt::isPositive()const { return !negative && !isZero(); } bool BigInt::isNegative()const { return negative; } bool BigInt::nonNegative()const { return !negative; } BigInt BigInt::opposite()const { BigInt n(*this); if (!n.isZero()) n.negative = !n.negative; return n; } BigInt BigInt::absoluteAdd(const BigInt& n)const { BigInt bi(*this); ;//进位 ; i<MAXBIT; ++i) { bi.bit[i] = (bit[i] + n.bit[i] + next) % ; next = (bit[i] + n.bit[i] + next) / ; } return bi; } BigInt BigInt::absoluteMinus(const BigInt& n)const { BigInt bi(*this); ; i>=; --i) { if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i]; else {//借位 ;//借位位 ) ++borrow; --bi.bit[borrow]; ; j<borrow; ++j) bi.bit[j] = ; bi.bit[i] = bi.bit[i] + - n.bit[i]; } } return bi; } bool BigInt::absoluteEqual(const BigInt& n)const { ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return false; } return true; } bool BigInt::absoluteGreater(const BigInt& n)const { ; i>=; --i) { if (bit[i]>n.bit[i]) return true; else if (bit[i]<n.bit[i]) return false; } return false; } bool BigInt::absoluteEqualGreater(const BigInt& n)const { ; i>=; --i) { if (bit[i]>n.bit[i]) return true; else if (bit[i]<n.bit[i]) return false; } return true; }
代码调用也挺方便,如下例子:
#include "BigInt.h" int main() { BigInt m = ; BigInt n("-32143542"); if (m >= n) puts("m >= n"); n = m + n; n = n * ; n.print(); ; }
模板写成后特地去poj刷了大数相加和大数相乘两道水题,一次ac的满足感可是杠杠的~
欢迎大家参考,测试,批评指正bug和不足之处,感谢~
---------------------------------------------------------------------------------------------
2014/10/15更新
添加了重载负号,+=,-=,*=,/=,%=,还有string()函数返回值的字符串功能
/*BigInt.h*/
#include <stdio.h> #include <string.h> #include <ctype.h> #define MAXBIT 1007 #define BITTYPE int class BigInt { private: BITTYPE bit[MAXBIT]; bool negative;//负数标志 public: BigInt(); //默认构造函数,值为0 BigInt(const int); //构造函数 BigInt(const char *); //构造函数 BigInt(const BigInt &); //复制构造函数 /*重载赋值运算符*/ BigInt& operator=(const BigInt&); BigInt& operator=(const int ); /*重载算数运算符*/ BigInt operator+(const BigInt& )const; BigInt operator+(const int )const; BigInt operator+=(const BigInt& ); BigInt operator+=(const int ); BigInt operator-(const BigInt& )const; BigInt operator-(const int )const; BigInt operator-=(const BigInt& ); BigInt operator-=(const int ); BigInt operator-( )const; BigInt operator*(const BigInt& )const; BigInt operator*(const int )const; BigInt operator*=(const BigInt& ); BigInt operator*=(const int ); BigInt operator/(const int )const; BigInt operator/=(const int ); int operator%(const int )const; BigInt operator%=(const int ); /*重载比较运算符*/ bool operator>(const BigInt& )const; bool operator>(const int )const; bool operator>=(const BigInt& )const; bool operator>=(const int )const; bool operator<(const BigInt& )const; bool operator<(const int )const; bool operator<=(const BigInt& )const; bool operator<=(const int )const; bool operator==(const BigInt& )const; bool operator==(const int )const; bool operator!=(const BigInt& )const; bool operator!=(const int )const; void print() const;//输出数值 char *string() const;//返回数值字符串 bool isZero() const;//是否为0 bool isPositive() const;//是否为正数 bool isNegative() const;//是否为负数 bool nonNegative() const;//是否为非负数 private: BigInt opposite()const;//取相反数 BigInt absoluteAdd(const BigInt&)const;//加上绝对值 BigInt absoluteMinus(const BigInt&)const;//减去绝对值小于自身的数的绝对值 bool absoluteEqual(const BigInt&)const;//绝对值等于 bool absoluteGreater(const BigInt&)const;//绝对值大于 bool absoluteEqualGreater(const BigInt&)const;//绝对值大于等于 }; BigInt::BigInt() { memset(bit,,sizeof(bit)); negative = false; } BigInt::BigInt(const int n) { memset(bit,,sizeof(bit)); int nn = n; ) negative = false; else { negative = true; nn = -nn; } ; while (nn) { bit[pos++] = nn % ; nn /= ; } } BigInt::BigInt(const char *s) { int len = strlen(s); bool valid = true;//符合数字格式 ) { ]!=]!=])) valid = false; ; i<len; ++i) { if (!isdigit(s[i])) valid = false; } } ) { ])) valid = false; } || !valid) { memset(bit,,sizeof(bit)); negative = false; return; } , end = len-; ] == '+') { negative = false; ++beg; } ] == '-') { bool zeroFlag = true; ; i<len; ++i) { ') { zeroFlag = false; break; } } if (zeroFlag) negative = false; else negative = true; ++beg; } else negative = false; memset(bit,,sizeof(bit)); for (int i=beg; i<=end; ++i) { bit[len--i] = s[i] - '; } } BigInt::BigInt(const BigInt& n) { memcpy(bit,n.bit,sizeof(bit)); negative = n.negative; } BigInt& BigInt::operator=(const BigInt& n) { memcpy(bit,n.bit,sizeof(bit)); negative = n.negative; return *this; } BigInt& BigInt::operator=(const int n) { return *this = BigInt(n); } BigInt BigInt::operator+(const BigInt& n)const { if ((!negative && !n.negative) || (negative && n.negative)) { return this->absoluteAdd(n); } else { if (absoluteEqual(n)) return BigInt(); else if (absoluteEqualGreater(n)) return this->absoluteMinus(n); else return n.absoluteMinus(*this); } } BigInt BigInt::operator+(const int n)const { return *this + BigInt(n); } BigInt BigInt::operator+=(const BigInt& n) { return *this = *this + n; } BigInt BigInt::operator+=(const int n) { return *this = *this + n; } BigInt BigInt::operator-(const BigInt& n)const { return *this + n.opposite(); } BigInt BigInt::operator-(const int n)const { return *this - BigInt(n); } BigInt BigInt::operator-=(const BigInt& n) { return *this = *this - n; } BigInt BigInt::operator-=(const int n) { return *this = *this - n; } BigInt BigInt::operator-()const { BigInt bi(*this); if (!this->isZero()) bi.negative = !bi.negative; return bi; } BigInt BigInt::operator*(const BigInt& n)const { if (isZero() || n.isZero()) return BigInt(); BigInt bi = BigInt(); if ((!negative && !n.negative) || (negative && n.negative)) { bi.negative = false; } else bi.negative = true; ; i<MAXBIT; ++i) ; j<MAXBIT-i; ++j) { bi.bit[i+j] += bit[i] * n.bit[j]; } ; i<MAXBIT-; ++i) {//进位 bi.bit[i+] += bi.bit[i] / ; bi.bit[i] %= ; } return bi; } BigInt BigInt::operator*(const int n)const { return *this * BigInt(n); } BigInt BigInt::operator*=(const BigInt& n) { return *this = *this - n; } BigInt BigInt::operator*=(const int n) { return *this = *this * n; } BigInt BigInt::operator/(const int n)const {//除以0直接返回0 ) return BigInt(); BigInt bi = BigInt(); ) || (negative && n<)) { bi.negative = false; } else bi.negative = true; ;//累计除数 ; i>=; --i) { div = div * + bit[i]; bi.bit[i] = div / n; div %= n; } return bi; } BigInt BigInt::operator/=(const int n) {//除以0直接返回0 ) return BigInt(); else return *this = *this / n; } int BigInt::operator%(const int n)const { ;//累计余数 ; i>=; --i) { //mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n; mod = ((mod*) + bit[i]) % n; } return mod; } BigInt BigInt::operator%=(const int n) { ;//累计余数 ; i>=; --i) { //mod = ((mod*(MAXBIT+1/*??*/)) + bit[i]) % n; mod = ((mod*) + bit[i]) % n; } return *this = BigInt(mod); } bool BigInt::operator>(const BigInt& n)const { if (!negative && n.negative) return true; else if (negative && !n.negative) return false; else if (!negative && !n.negative) return absoluteGreater(n); else return n.absoluteGreater(*this); } bool BigInt::operator>(const int n)const { return *this > BigInt(n); } bool BigInt::operator>=(const BigInt& n)const { if (!negative && n.negative) return true; else if (negative && !n.negative) return false; else if (!negative && !n.negative) return absoluteEqualGreater(n); else return n.absoluteEqualGreater(*this); } bool BigInt::operator>=(const int n)const { return *this >= BigInt(n); } bool BigInt::operator<(const BigInt& n)const { return n > *this; } bool BigInt::operator<(const int n)const { return *this < BigInt(n); } bool BigInt::operator<=(const BigInt& n)const { return n >= *this; } bool BigInt::operator<=(const int n)const { return *this <= BigInt(n); } bool BigInt::operator==(const BigInt& n)const { if (negative != n.negative) return false; ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return false; } return true; } bool BigInt::operator==(const int n)const { return *this == BigInt(n); } bool BigInt::operator!=(const BigInt& n)const { if (negative != n.negative) return true; ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return true; } return false; } bool BigInt::operator!=(const int n)const { return *this != BigInt(n); } void BigInt::print()const { if (negative) printf("-"); ; ; --pos) { if (bit[pos]) break; } ; --i) printf("%d",bit[i]); } char *BigInt::string()const { ]; ; if (negative) content[posi++] = '-'; ; ; --pos) { if (bit[pos]) break; } //printf("pos = %d\n",pos); ; --i) { content[posi++] = bit[i] + '; //printf("bit[%d] = %d\n",i,bit[i]); } content[posi] = '\0'; return content; } bool BigInt::isZero()const { bool zeroFlag = true; ; i<MAXBIT; ++i) { ) { zeroFlag = false; break; } } return zeroFlag; } bool BigInt::isPositive()const { return !negative && !isZero(); } bool BigInt::isNegative()const { return negative; } bool BigInt::nonNegative()const { return !negative; } BigInt BigInt::opposite()const { BigInt n(*this); if (!n.isZero()) n.negative = !n.negative; return n; } BigInt BigInt::absoluteAdd(const BigInt& n)const { BigInt bi(*this); ;//进位 ; i<MAXBIT; ++i) { bi.bit[i] = (bit[i] + n.bit[i] + next) % ; next = (bit[i] + n.bit[i] + next) / ; } return bi; } BigInt BigInt::absoluteMinus(const BigInt& n)const { BigInt bi(*this); ; i>=; --i) { if (bi.bit[i]>=n.bit[i]) bi.bit[i] -= n.bit[i]; else {//借位 ;//借位位 ) ++borrow; --bi.bit[borrow]; ; j<borrow; ++j) bi.bit[j] = ; bi.bit[i] = bi.bit[i] + - n.bit[i]; } } return bi; } bool BigInt::absoluteEqual(const BigInt& n)const { ; i<MAXBIT; ++i) { if (bit[i] != n.bit[i]) return false; } return true; } bool BigInt::absoluteGreater(const BigInt& n)const { ; i>=; --i) { if (bit[i]>n.bit[i]) return true; else if (bit[i]<n.bit[i]) return false; } return false; } bool BigInt::absoluteEqualGreater(const BigInt& n)const { ; i>=; --i) { if (bit[i]>n.bit[i]) return true; else if (bit[i]<n.bit[i]) return false; } return true; }