C++高精度模板
来源:互联网 发布:网络运营工程师做什么 编辑:程序博客网 时间:2024/06/06 06:44
很好的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 ++()//前缀++ { *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;}
1 0
- c高精度加法模板
- 高精度c语言模板
- C++bign类高精度模板
- 高精度运算模板C语言
- 高精度模板 c++/类封装
- 大神写的高精度模板 C/C++
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- Valid Anagram&Group Anagrams
- 代码动态设置字体颜色
- 获取mac最高root权限登录系统
- 还是-1岁的产品经理
- 毛泽东文选 mp3
- C++高精度模板
- 定义表示乘法的函数对象--重载函数
- (RHCSA)4 日志系统简单配置
- 拉格朗日乘数法
- 从0开始搭建一个微服务的持续交付系统
- Python学习笔记-逻辑运算口诀表
- 虚拟机垃圾收集算法
- 第十五周项目 阅读程序(2)
- jsp指令中的taglib指令