bignum 大数模板
今天无意间看到一个很好的大数模板,能算加、减、乘、除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减。我借用了一下:(作过少许代码上的精简)
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- const int maxn = ;
- struct bign{
- int len, s[maxn];
- bign(){
- memset(s,,sizeof(s));
- len= ;
- }
- bign(int num) { *this = num; }
- bign(const char *num) { *this = num; }
- bign operator = (const int num){
- char s[maxn];
- sprintf(s,"%d",num);
- return *this = s;
- }
- bign operator = (const char *num){
- for(int i = ; num[i] && num[i] ==''; ++num) ;
- len = strlen(num);
- for(int i = ; i < len; ++i)
- s[i] = num[len--i] -'';
- return *this;
- }
- bign operator + (const bign &b) const {
- bign c;
- c.len = ;
- int maxlen = max(len, b.len);
- for(int i = , g = ; g || i < maxlen; ++i){ // g是进位
- int x = g;
- if(i < len) x += s[i];
- if(i < b.len) x += b.s[i];
- c.s[c.len++] = x % ;
- g = x / ;
- }
- return c;
- }
- bign operator += (const bign &b){
- return *this = *this + b;
- }
- void clean(){
- while(len > && !s[len-]) --len;
- }
- bign operator * (const bign &b) const {
- bign c;
- c.len = len + b.len;
- for(int i = ; i < len; ++i)
- for(int j = ; j < b.len; ++j)
- c.s[i+j] += s[i] * b.s[j];
- for(int i = ; i < c.len; ++i){
- c.s[i+] += c.s[i]/;
- c.s[i] %= ;
- }
- c.clean();
- return c;
- }
- bign operator *= (const bign &b){
- return *this = *this * b;
- }
- bign operator -(const bign &b) const {
- bign c;
- c.len = ;
- for(int i = , g = ; i < len; ++i){ //此时的 g是退位
- int x = s[i]- g;
- if(i < b.len) x -= b.s[i];
- if(x >= ) g = ;
- else {
- g = ;
- x += ;
- }
- c.s[c.len++] = x;
- }
- c.clean();
- return c;
- }
- bign operator -= (const bign &b){
- return *this = *this - b;
- }
- bign operator / (const bign &b) const {
- bign c, f = ;
- for(int i = len-; i >= ; --i){
- f *= ;
- f.s[] = s[i];
- while(f >= b){
- f -= b;
- ++c.s[i];
- }
- }
- c.len = len;
- c.clean();
- return c;
- }
- bign operator /= (const bign &b){
- return *this = *this / b;
- }
- bign operator % (const bign &b) const {
- bign r = *this / b;
- return *this- r*b;
- }
- bign operator %= (const bign &b){
- return *this = *this % b;
- }
- bool operator < (const bign &b) const {
- if(len != b.len) return len < b.len;
- for(int i= len-; i>=; --i)
- if(s[i] != b.s[i]) return s[i] < b.s[i];
- return ;
- }
- bool operator > (const bign &b) const {
- if(len != b.len) return len > b.len;
- for(int i = len-; i >= ; --i)
- if(s[i] != b.s[i]) return s[i] > b.s[i];
- return ;
- }
- bool operator == (const bign &b) const {
- return !(*this < b || *this > b);
- }
- bool operator != (const bign &b) const {
- return !(*this == b);
- }
- bool operator <= (const bign &b) const {
- return *this < b || *this == b;
- }
- bool operator >= (const bign &b) const {
- return *this > b || *this == b;
- }
- string str() const {
- string res = "";
- for(int i = ; i < len; ++i)
- res = char(s[i]+'') + res; //这里一定不能掉乱 +的顺序!
- return res;
- }
- };
- istream& operator >> (istream &in, bign &x){
- string s;
- in >> s;
- x = s.c_str();
- return in;
- }
- ostream& operator << (ostream &out, const bign &x){
- out << x.str();
- return out;
- }
- int main()
- {
- bign a,b,c,d,e,f,g;
- while(cin>>a>>b)
- {
- a.clean();
- b.clean();
- c = a+b;
- d = a-b;
- e = a*b;
- f = a/b;
- g = a%b;
- cout<<"a+b = "<<c<<endl;
- cout<<"a-b = "<<d<<endl;
- cout<<"a*b = "<<e<<endl;
- cout<<"a/b = "<<f<<endl;
- cout<<"a%b = "<<g<<endl;
- cout<<(a==b? "a = b":"a != b")<<endl;
- }
- return ;
- }
在此感谢原博客的模板提供: bign类C++高精度模板
bignum 大数模板的更多相关文章
- hdu 5429 Geometric Progression(存个大数模板)
Problem Description Determine whether a sequence is a Geometric progression or not. In mathematics, ...
- 【集训笔记】【大数模板】特殊的数 【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 ...
- 大数模板 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的倍数的灯泡改变状 ...
- c++大数模板
自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...
- ACM大数模板(支持正负整数)
之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大 ...
- 大数模板 (C ++)
上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. //可以处理字符串前导零 #i ...
随机推荐
- [转]在iOS项目中使用CorePlot框架
转载地址:http://blog.csdn.net/llfjfz/article/details/7849190#comments Core Plot是OS X和IOS下的一个开源图形库,它提供数据的 ...
- Poj(3686),最小权匹配,多重匹配,KM
题目链接 The Windy's | Time Limit: 5000MS | Memory Limit: 65536K | | Total Submissions: 4939 | Accepted: ...
- Robotium中定位Android客户端疑难元素
对于没有id,没有text,只有一个图标的疑难元素(ImageView),应该如何定位呢?拿人人网个人主页的设置按钮举例: 我最终是通过定位页面上可以定位到的其他元素,然后通过其他元素与疑难元素相对坐 ...
- Reflection实现通用增删改
新增 /// <summary> /// 通用新增方法 /// </summary> /// <param name="arr">一行数据封装的 ...
- PHP比较运算!=和!==
PHP!=和!==的区别 !==是指绝对不等于,比如,$a = 3, $b="3" 那么,$a!==$b成立,可是$a!=$b不成立:
- JavaScript的学习
学习了一段时间了,oop 的JavaScript .但是理解了还不是很深入,所以,决定.通过写博客的方式来,加深JavaScript的程度.2016的目标: 第一阶段:oop的JavaScript 第 ...
- 2016年11月3日 星期四 --出埃及记 Exodus 19:19
2016年11月3日 星期四 --出埃及记 Exodus 19:19 and the sound of the trumpet grew louder and louder. Then Moses s ...
- P2679 子串
http://www.luogu.org/problem/show?pid=2679 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后 ...
- UICollectionView 使用
/** 初始化UICollectionView */ UICollectionViewFlowLayout *flowLayout=[[UICollectionViewFlowLayout alloc ...
- centos7 安装 mariadb 的正确命令
使用的是linode的centos7系统,安装mysql发现已经默认的是mariadb. 但是不管是使用linode官网说明还是百度搜索到的的根本安装方法无法安装成功. 总是提示这一句: ERROR ...