ACM大数模板(支持正负整数)
之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成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; }
ACM大数模板(支持正负整数)的更多相关文章
- 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...
- hdu1042(大数模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 在网上找了个大数模板方便以后用得到. #include<iostream> #inc ...
- HDU 1134 Game of Connections(卡特兰数+大数模板)
题目代号:HDU 1134 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 20 ...
- bignum 大数模板
今天无意间看到一个很好的大数模板,能算加.减.乘.除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减.我借用 ...
- c++大数模板
自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...
- 大数模板 poj3982
1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就 ...
- Hdu 4762 网络赛 高精度大数模板+概率
注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...
- vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)
P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...
- 让ecshop模板支持php运算
让ecshop模板支持php运算在 cls_template.php 底部加入函数: /** * 处理if标签 * * @access public * @param string $tag_args ...
随机推荐
- 常用WebService收集
尊重原著作:本文转载自http://www.cnblogs.com/tianguook/archive/2010/09/29/1838469.html 天气预报Web服务,数据来源于中国气象局Endp ...
- Oracle GoldenGate配置异构数据库数据传输(oracle到sqlserer)的dml操作(带pump进程)
实验环境:os01:Red Hat Enterprise Linux Server release 5.1 (32位)db01:oracle 10.2.0.1.0 os02:Windows 7 (32 ...
- iOS断点及打印日志
首先,最简单的断点就是在Xcode项目文件中任意一行行号那点一下,就是加了一个断点 再次点击会变成浅蓝色,表示disable掉了 disable掉的断点不会起作用,但会在左上角蓝色的标签那留下记录,这 ...
- javascript 正则表达式代码
正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表 ...
- [Poco库]使用经验
1. Link错误 在Windows平台下使用时link报错 "CreateProcess is not defined"的解决GetEnvironmentVariable / S ...
- css实现两端对齐的3种方法
两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...
- distance.c
#include "stdio.h" #include "string.h" #include "math.h" #include &quo ...
- scikit-learn的主要模块和基本使用
1.加载数据(Data Loading) 假设输入是特征矩阵或者csv文件,首先数据被载入内存. scikit-learn的实现使用了NumPy中的arrays,所以,使用NumPy来载入csv文件. ...
- Generator & yield write in sync way
Generator & yield write in sync way var p = new Promise(function(resolve, reject){ setTimeout(fu ...
- collection set
http://blog.csdn.net/humingfiy/article/details/7946408 Collection:List.SetMap:HashMap.HashTable 如何在它 ...