高精度模板3.0
来源:互联网 发布:linux客户端是什么意思 编辑:程序博客网 时间:2024/06/03 02:56
高精度模板3.0,支持正整数除除法及取模运算外的所有基本运算以及大小比较,乘法经过改进后基本没有问题
#include<cstdio> #include<iostream> #include<vector> #include<cstring>#define LL long long using namespace std; struct bigint{ static const int base=1000000000; static const int width=9; vector<LL>s; bigint (LL num=0){*this=num;} bigint operator = (LL num){ s.clear(); do{ s.push_back(num%base); num/=base; }while(num>0); return *this; } bigint operator = (const string& str){ s.clear(); int x,len=(str.length()-1)/width+1; for(int i=0;i<len;i++){ int end=str.length()-i*width; int start=max(0,end-width); sscanf(str.substr(start,end-start).c_str(),"%d",&x); s.push_back(x); } return *this; } bigint operator + (const bigint& b) const{ bigint c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0&&i>=s.size()&&i>=b.s.size())break; int x=g; if(i<s.size())x+=s[i]; if(i<b.s.size())x+=b.s[i]; c.s.push_back(x%base); g=x/base; } return c; } bigint operator - (const bigint& b) const{ bigint c; c.s.clear(); for(int i=0,g=0;;i++){ if(g==0&&i>=s.size())break; int x=g; if(i<s.size())x+=s[i]; if(i<b.s.size())x-=b.s[i]; if(x<0)x+=base,g=-1; else g=0; c.s.push_back(x); } return c; } bigint operator * (const bigint& b) const{ bigint c; c.s.clear(); LL i,j,g; LL temp,temp1; c.s.resize(s.size()+b.s.size()); for(i=0;i<s.size();i++){ g=0,temp1=0; for(j=0;j<b.s.size();j++){ LL x=c.s[i+j]; temp=s[i]*b.s[j]+g; g=temp/base; x+=temp%base+temp1; temp1=x/base; x%=base; c.s[i+j]=x; } if(g!=0) c.s[i+j]=g; } if(temp1!=0) c.s[i+j]=temp1; while(c.s.back()==0&&c.s.size()>1) c.s.pop_back(); return c; } bool operator < (const bigint&b) const{ if(s.size()!=b.s.size())return s.size()<b.s.size(); for(int i=s.size()-1;i>=0;i--) if(s[i]!=b.s[i])return s[i]<b.s[i]; return false; } bool operator > (const bigint&b) const{return b<*this;} bool operator <= (const bigint&b) const{return !(b<*this);} bool operator >= (const bigint&b) const{return !(*this>b);} bool operator != (const bigint&b) const{return b<*this|| *this<b;} bool operator == (const bigint&b) const{return !(b<*this)&&!(*this<b);}bigint operator *= (const bigint &b){*this=(*this)*b; return *this;} bigint operator -= (const bigint &b){*this=(*this)-b; return *this;} bigint operator += (const bigint &b){*this=(*this)+b; return *this;} bigint operator ++ (int){*this=*this+1; return *this;} bigint& operator ++ () {*this=*this+1; return *this;} bigint operator -- (int){*this=*this-1; return *this;} bigint& operator -- (){*this=*this-1; return *this;} }; ostream& operator << (ostream &out,const bigint& x){ out<<x.s.back(); for(int i=x.s.size()-2;i>=0;i--){ char buf[20]; sprintf(buf,"%09d",x.s[i]); for(int j=0;j<strlen(buf);j++)out<<buf[j]; } return out; } istream& operator >> (istream &in,bigint&x){ string s; if(!(in>>s))return in; x=s; return in; } int main(){ bigint a,b; cin>>a>>b; cout<<a*b; }
0 0
- 高精度模板3.0
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 【模板】高精度
- 高精度模板
- 【C】echo命令的实现
- 如何检测手机系统,如何检测页面是微信还是QQ打开
- C语言分支结构
- 钉钉开发系列(四)获取JS票据
- 删除用户自定义配置
- 高精度模板3.0
- Notification Once
- iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画
- 字符串转成实数-atof
- ACM--百分比求值--HDOJ 1701--ACMer--水
- 序列和索引
- JD 2016年实习生笔试题
- 训练3 习题11
- CAN总线发送与接收函数