高精度模板2.0
来源:互联网 发布:秋冬防晒 知乎 编辑:程序博客网 时间:2024/06/15 00:42
这次修改后的高精度模板支持了部分正整数乘法(但是有些数据有问题)
#include<cstdio> #include<iostream> #include<vector> #include<cstring> using namespace std; struct bigint{ static const int base=100000000; static const int width=8; vector<int>s; bigint (long long num=0){*this=num;} bigint operator = (long long 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(); int i,j,g; int 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++){ int 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);} }; 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,"%08d",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
- 高精度模板2.0
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 【模板】高精度
- 高精度模板
- ACM--多边形重心–-HDOJ 1115-- Lifting the Stone
- Java环境搭建,以win10为例
- Android 开发中的微技巧和小知识
- 读完这100篇论文 就能成大数据高手
- 训练3 习题15
- 高精度模板2.0
- modelsim10.2c安装教程
- 发几张18650锂电池的放电曲线
- 喜剧者联盟观后感
- SSM框架的搭建(Spring+SpringMVC+Mybatis第一个项目的搭建)
- 爱的方程
- Java基础——多态
- JAVA简单读取xls表格
- 在Django中使用markdown