高精度模板
2016-05-20 22:58
253 查看
我有自己的高精度模板啦!!!哈哈哈!!!
支持正整数的加减乘除(不支持小减大...),以及取模运算.
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn=1000; struct Bign{ int x[maxn],cnt; int & operator [] (int id){ return x[id]; } Bign(){ memset(x,0,sizeof x); }//空的构造函数 Bign(int num){ *this=num; }//赋一个数字的构造函数 Bign(char* num){ *this=num; }//赋一个字符串数字的构造函数 Bign operator = (const char* num){//字符串的赋值函数 memset(x,0,sizeof x); cnt=strlen(num); for(int i=1;i<=cnt;i++) x[i]=num[cnt-i-1]-'0'; return *this; } Bign operator = (int num){//数字的赋值函数 memset(x,0,sizeof x); cnt=0; while(num){ x[++cnt]=num%10; num/=10; } return *this; } Bign operator + (Bign y) const{//加法 Bign z; z.cnt=max(cnt,y.cnt); for(int i=1;i<=z.cnt;i++){ z[i]+=x[i]+y[i]; if(z[i]>=10) z[i+1]++, z[i]-=10; } if(z[z.cnt+1]) z.cnt++;//加法至多多出一位 return z; } Bign operator - (Bign y) const{//减法 Bign z; z.cnt=cnt; for(int i=1;i<=z.cnt;i++){ z[i]+=x[i]-y[i]; if(z[i]<0) z[i+1]--, z[i]+=10; } while(z.cnt&&!z[z.cnt]) z.cnt--;//减法可能会少很多位 return z; } Bign operator * (Bign y) const{//乘法 Bign z; for(int i=1;i<=cnt;i++) for(int j=1;j<=y.cnt;j++) z[i+j-1]+=x[i]*y[j],z[i+j]+=z[i+j-1]/10, z[i+j-1]%=10; z.cnt=cnt+y.cnt;//乘法后结果的位数为cnt1+cnt2或cnt1+cnt2-1. if(!z[z.cnt]) z.cnt--; return z; } Bign operator / (Bign y) const{//除法 Bign z=*this,d=0; for(int i=cnt;i;i--){ d=d*10+x[i]; for(int j=0;j<10;j++) if(d<y*(j+1)){ z[i]=j; d=d-y*j; break; } } while(z.cnt&&!z[z.cnt]) z.cnt--; return z; } Bign operator % (Bign y) const{//取模 Bign d=0; for(int i=cnt;i;i--){ d=d*10+x[i]; for(int j=0;j<10;j++) if(d<y*(j+1)){ d=d-y*j; break; } } return d; } Bign &operator += (Bign y){ *this=*this+y; return *this; } Bign &operator -= (Bign y){ *this=*this-y; return *this; } Bign &operator *= (Bign y){ *this=*this*y; return *this; } Bign &operator /= (Bign y){ *this=*this/y; return *this; } Bign &operator %= (Bign y){ *this=*this%y; return *this; } bool operator < (Bign y){ if(cnt!=y.cnt) return cnt<y.cnt; for(int i=cnt;i;i--) if(x[i]!=y[i]) return x[i]<y[i]; return false; } bool operator > (Bign y){ return y<*this; } bool operator <= (Bign y){ return!(y<*this); } bool operator >= (Bign y){ return!(*this<y); } bool operator != (Bign y){ return y<*this||*this<y; } bool operator == (Bign y){ return!(y<*this)&&!(*this<y); } }a,b; istream& operator >> (istream &in,Bign &x){//输入 char s[maxn]; scanf("%s",s+1); int len=strlen(s+1); for(int i=len;i;i--) x[len+1-i]=s[i]-'0'; x.cnt=len; return in; } ostream& operator << (ostream &out,Bign &x){//输出 for(int i=x.cnt;i;i--) out << x[i]; if(!x.cnt) out << 0; return out; } int main(){ cin >> a >> b; Bign c=a%b; cout << c <<endl; return 0; }View Code
相关文章推荐
- JS是单线程的吗?
- 按键精灵手机版定时点击脚本
- convert-sorted-list-to-binary-search-tree
- windows下读取Linux分区软件
- 教你如何使用Redis:[7]redis常用命令
- Ganglia监控Spark
- IPv6协议原理以及跟IPv4的差别
- 杂谈
- 小sugar呀——康托展开与逆展开
- JSON格式
- 利用脚本脚本实现修改CSS样式
- 利用脚本脚本实现修改CSS样式
- 利用脚本脚本实现修改CSS样式
- 利用脚本脚本实现修改CSS样式
- 利用脚本脚本实现修改CSS样式
- Mac升级到 OSX 10.11 El Capitan 后 Operation not permitted - /usr/bin/sass
- shell学习-if判断
- 数据结构----冒泡排序
- 利用脚本脚本实现修改CSS样式
- 利用脚本脚本实现修改CSS样式