高精度四则运算(万进制)C++
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
压位高精(万进制)
//头文件:thp.h
#ifndef _cstring_
#define _cstring_
#include
#endif
#ifndef _cstdlib_
#define _cstdlib_
#include
#endif
const int THP_MAXLEN=1000;
const int THP_MAXSTRLEN=4040;
const int L0=10000;
class thp
{
friend const thp operator-(const thp&,const thp&);
friend const thp operator+(const thp&,const thp&);
friend const thp operator*(const thp&,const thp&);
friend const thp operator/(const thp&,const thp&);
friend void thpdiv(const thp&,const thp&,thp&,thp&);
friend const thp operator%(const thp&,const thp&);
public:
const thp& operator=(const thp&);
const thp& operator=(const char*);
bool operator==(const thp&)const;
bool operator>=(const thp&)const;
bool operator<=(const thp&)const;
inline bool operator!=(const thp&)const;
bool operator>(const thp&)const;
bool operator<(const thp&)const;
inline void shl(const int);
const thp& operator ++ ();
inline void makeempty();
const char *tostr()const;
inline thp& operator-=(const thp&);
thp();
thp(const char*);
const int thpstd();
protected:
int _data[THP_MAXLEN],_high,_sign;
private:
};
// 源代码 thp.cpp
#include "thp.h"
const int thp::thpstd()
{ int i;
for(i=0;i<=_high;i++)
{ while(_data[i]<0)
{ _data[i]+=L0;
_data[i+1]--;
}
}
return(0);
}
const thp operator % (const thp &a,const thp &b) { thp re1,re2;
thpdiv(a,b,re1,re2);
return(re2);
}
const thp& thp::operator ++ ()
{ _data[0]++;
if(_data[0]>=L0)this->thpstd();
return(*this);
}
void thp::shl(const int n)
{ int i;
for(i=_high;i>=0;i--)
{ _data[i+n]=_data[i];
}
_high+=n;
if(_data[_high]==0)_high=0;
}
thp& thp::operator -= (const thp &o)
{ int tint,i,len;
for(i=0;i<=_high;i++)
{ tint=_data[i]-o._data[i];
if(tint<0)
{ tint+=L0;
_data[i+1]--;
}
_data[i]=tint;
}
for(len=this->_high;len>=0;len--)
{ if(_data[len]!=0)break;
if(len==0)break;
}
_high=len;
return(*this);
}
void thpdiv(const thp &a,const thp &b,thp &c,thp &d) { int i;
d.makeempty();
c.makeempty();
for(i=a._high;i>=0;i--)
{ d.shl(1);
d._data[0]=a._data[i];
while(b<=d)
{ d-=b;
c._data[i]++;
}
if(i==0)break;
}
c._high=0;
for(i=a._high;i>0;i--)
{ if(c._data[i]!=0)