您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息