C++高精度模板
2016-06-07 14:36
387 查看
很好的C++高精度模板,本文均为原创。如发现BUG,请留言,感谢。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> using namespace std; struct bignum { string s; string delzero()//去前导0 { for(int i=0;i<s.size();i++) { if(s[i]!=48) { s=s.substr(i,s.size()-i); return s; } } s="0"; return s; } string align(string s,int len)//加减法的位对齐 { for(int i=s.size();i<len;i++) s=(char)48+s; return s; } bignum() { s=""; } bignum(int num) { *this=num; } bignum operator =(int num) { char ss[100]; sprintf(ss,"%d",num); s=ss; return *this; } bignum operator +(bignum b)//加 { bignum c;int jin=0; int len=s.size()>=b.s.size()?s.size():b.s.size(); s=align(s,len);b.s=align(b.s,len); for(int i=s.size()-1;i>=0;i--) { c.s=(char)((s[i]+b.s[i]+jin-96)%10+48)+c.s; jin=(s[i]+b.s[i]+jin-96)/10; } if(jin) c.s=(char)(jin+48)+c.s; return c; } bignum operator -(bignum b)//减(小数减大数会返回差的绝对值) { bignum c;int jie=0; if(*this<b) return b-*this; int len=s.size()>=b.s.size()?s.size():b.s.size(); b.s=align(b.s,len); for(int i=s.size()-1;i>=0;i--) { char d=(s[i]-b.s[i]-jie)+48; if(s[i]-b.s[i]-jie<0) { d+=10;jie=1; } else jie=0; c.s=d+c.s; } return c; } bignum operator *(bignum b)//乘 { bignum a=0; for(int j=b.s.size()-1;j>=0;j--) { bignum c;int jin=0; for(int i=s.size()-1;i>=0;i--) { int t=(s[i]-48)*(b.s[j]-48)+jin; c.s=(char)(t%10+48)+c.s; jin=t/10; } if(jin) c.s=(char)(jin+48)+c.s; for(int i=0;i<b.s.size()-1-j;i++) c.s=c.s+"0"; a+=c; } return a; } bignum operator /(bignum b)//除 { bignum c,d;int t,q=0; d.s=s.substr(0,b.s.size()); if(d<b) { d.s=s.substr(0,b.s.size()+1);q++; } for(int i=q;i<=s.size()-b.s.size();i++) { t=48; while(d>=b) { d-=b;t++; } if(s.size()>=i+b.s.size()) { d.s=d.s+s.substr(i+b.s.size(),1); d.delzero();c.s=c.s+(char)t; } } return c; } bignum operator %(bignum b)//模 { bignum c=*this/b; c=*this-c*b; return c; } bignum operator +=(bignum b)//加等 { *this=*this+b; return *this; } bignum operator -=(bignum b)//减等 { *this=*this-b; return *this; } bignum operator *=(bignum b)//乘等 { *this=*this*b; return *this; } bignum operator /=(bignum b)//除等 { *this=*this/b; return *this; } bignum operator %=(bignum b)//模等 { *this=*this%b; return *this; } bignum operator ^(bignum b)//乘方 { bignum d=*this; for(bignum i=1;i<b;i++) *this *=d; return *this; } bignum operator !()//阶乘 { bignum d=1; for(bignum i=1;i<=*this;i++) d*=i; return d; } bignum operator ++()//前缀++ { * b34b this+=1; return *this; } bignum operator --()//前缀-- { *this-=1; return *this; } bignum operator ++(int)//后缀++ { *this+=1; return *this-1; } bignum operator --(int)//后缀-- { *this-=1; return *this+1; } bool operator <(bignum b)//小于 { delzero(),b.delzero(); if(s.size()!=b.s.size()) return s.size()<b.s.size(); for(int i=0;i<s.size();i++) if(s[i]!=b.s[i]) return s[i]<b.s[i]; return 0; } bool operator >(bignum b)//大于 { delzero(),b.delzero(); if(s.size()!=b.s.size()) return s.size()>b.s.size(); for(int i=0;i<s.size();i++) if(s[i]!=b.s[i]) return s[i]>b.s[i]; return 0; } bool operator ==(bignum b)//等于 { return !(*this>b)&&!(*this<b); } bool operator !=(bignum b)//不等于 { return !(*this==b); } bool operator <=(bignum b)//小于等于 { return !(*this>b); } bool operator >=(bignum b)//大于等于 { return !(*this<b); } }; istream& operator >>(istream &in,bignum &x)//输入 { in>>x.s; x.delzero(); return in; } ostream& operator <<(ostream &out,bignum &x)//输出 { x.delzero(); out<<x.s; return out; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解