h
/*-------------------------------------------------------*
* CopyRight 2007 北京交通大学
*
* 最后修改日期:2007-4-7
*
* 文件名:HugeInt.h
*
* 描述:HugeInt类的定义文件,定义了四则运算的接口
*
---------------------------------------------------------*/
#include <iostream>
const int MAXLEN=2000;
class HugeInt
{
public:
//构造函数
HugeInt();
HugeInt(const int& iOperand);
//拷贝函数
void operator =(int iOperand);
void operator =(HugeInt &hOperand);
//IO接口
friend std::ostream& operator <<(std::ostream& out,HugeInt &R);
//关系运算接口
bool operator == (HugeInt &R);
bool operator == (const int &iOperand);
bool operator != (HugeInt &R);
bool operator != (const int &R);
bool operator <= (HugeInt &R);
bool operator <= (const int &R);
bool operator < (HugeInt &hInt);
bool operator < (const int &iOperand);
bool operator >= (HugeInt &hOperand);
bool operator >= (const int &iOperand);
bool operator > (HugeInt &hOperand);
bool operator > (const int &iOperand);
//加法接口
HugeInt operator + (HugeInt &hOperand);
HugeInt operator + (int iOperand);
HugeInt& operator += (HugeInt &R);
HugeInt& operator += (int R);
HugeInt& operator ++ ();//前置
void operator ++ (int);//后置
//减法接口
HugeInt operator - (HugeInt& hOperand);
HugeInt operator - (int iOperand);
void operator -= (HugeInt &hOperand);
void operator -= (const int &iOperand);
void operator -- ();
void operator -- (int);
//除法接口
HugeInt operator /(HugeInt &hOperand);
HugeInt operator /(int R);
HugeInt& operator /=(HugeInt &hOperand);
HugeInt& operator /=(int iOperand);
//乘法接口
HugeInt operator *(HugeInt &R);
HugeInt operator *(int R);
HugeInt& operator *=(HugeInt &R);
HugeInt& operator *=(int R);
//输出接口
Print();
//公用接口
int Len(){return m_len;}
HugeInt FillTen(HugeInt &hInt,int start,int end,int len);
HugeInt TakeHigh(HugeInt &hInt,int start,int end);
private:
int m_sign; //符号
int m_len; //长度
char m_num[MAXLEN]; //存储空间
};
/*-------------------------------------------------------*
* CopyRight 2007 北京交通大学
*
* 最后修改日期:2007-4-7
*
* 文件名:HugeInt.h
*
* 描述:HugeInt类的定义文件,定义了四则运算的接口
*
---------------------------------------------------------*/
#include <iostream>
const int MAXLEN=2000;
class HugeInt
{
public:
//构造函数
HugeInt();
HugeInt(const int& iOperand);
//拷贝函数
void operator =(int iOperand);
void operator =(HugeInt &hOperand);
//IO接口
friend std::ostream& operator <<(std::ostream& out,HugeInt &R);
//关系运算接口
bool operator == (HugeInt &R);
bool operator == (const int &iOperand);
bool operator != (HugeInt &R);
bool operator != (const int &R);
bool operator <= (HugeInt &R);
bool operator <= (const int &R);
bool operator < (HugeInt &hInt);
bool operator < (const int &iOperand);
bool operator >= (HugeInt &hOperand);
bool operator >= (const int &iOperand);
bool operator > (HugeInt &hOperand);
bool operator > (const int &iOperand);
//加法接口
HugeInt operator + (HugeInt &hOperand);
HugeInt operator + (int iOperand);
HugeInt& operator += (HugeInt &R);
HugeInt& operator += (int R);
HugeInt& operator ++ ();//前置
void operator ++ (int);//后置
//减法接口
HugeInt operator - (HugeInt& hOperand);
HugeInt operator - (int iOperand);
void operator -= (HugeInt &hOperand);
void operator -= (const int &iOperand);
void operator -- ();
void operator -- (int);
//除法接口
HugeInt operator /(HugeInt &hOperand);
HugeInt operator /(int R);
HugeInt& operator /=(HugeInt &hOperand);
HugeInt& operator /=(int iOperand);
//乘法接口
HugeInt operator *(HugeInt &R);
HugeInt operator *(int R);
HugeInt& operator *=(HugeInt &R);
HugeInt& operator *=(int R);
//输出接口
Print();
//公用接口
int Len(){return m_len;}
HugeInt FillTen(HugeInt &hInt,int start,int end,int len);
HugeInt TakeHigh(HugeInt &hInt,int start,int end);
private:
int m_sign; //符号
int m_len; //长度
char m_num[MAXLEN]; //存储空间
};
/*-------------------------------------------------------* * CopyRight 2007 北京交通大学 * * 最后修改日期:2007-4-7 * * 文件名:HugeInt.h * * 描述:HugeInt类的定义文件,定义了四则运算的接口 * ---------------------------------------------------------*/ #include <iostream> const int MAXLEN=2000; class HugeInt { public: //构造函数 HugeInt(); HugeInt(const int& iOperand); //拷贝函数 void operator =(int iOperand); void operator =(HugeInt &hOperand); //IO接口 friend std::ostream& operator <<(std::ostream& out,HugeInt &R); //关系运算接口 bool operator == (HugeInt &R); bool operator == (const int &iOperand); bool operator != (HugeInt &R); bool operator != (const int &R); bool operator <= (HugeInt &R); bool operator <= (const int &R); bool operator < (HugeInt &hInt); bool operator < (const int &iOperand); bool operator >= (HugeInt &hOperand); bool operator >= (const int &iOperand); bool operator > (HugeInt &hOperand); bool operator > (const int &iOperand); //加法接口 HugeInt operator + (HugeInt &hOperand); HugeInt operator + (int iOperand); HugeInt& operator += (HugeInt &R); HugeInt& operator += (int R); HugeInt& operator ++ ();//前置 void operator ++ (int);//后置 //减法接口 HugeInt operator - (HugeInt& hOperand); HugeInt operator - (int iOperand); void operator -= (HugeInt &hOperand); void operator -= (const int &iOperand); void operator -- (); void operator -- (int); //除法接口 HugeInt operator /(HugeInt &hOperand); HugeInt operator /(int R); HugeInt& operator /=(HugeInt &hOperand); HugeInt& operator /=(int iOperand); //乘法接口 HugeInt operator *(HugeInt &R); HugeInt operator *(int R); HugeInt& operator *=(HugeInt &R); HugeInt& operator *=(int R); //输出接口 Print(); //公用接口 int Len(){return m_len;} HugeInt FillTen(HugeInt &hInt,int start,int end,int len); HugeInt TakeHigh(HugeInt &hInt,int start,int end); private: int m_sign; //符号 int m_len; //长度 char m_num[MAXLEN]; //存储空间 };
cpp
/*-------------------------------------------------------*
* CopyRight 2007 北京交通大学 *
*
* 最后修改日期:2007-4-7
*
* 文件名:HugeInt.cpp
*
* 描述:HugeInt类的实现文件,实现了四则运算
*
---------------------------------------------------------*/
#include "HugeInt.h"
#include <iostream>
#include <memory>
#include <cmath>
using namespace std;
HugeInt::HugeInt()
{
memset(m_num,0,sizeof(char)*MAXLEN);
m_sign=0;
m_len=0;
}
HugeInt::Print()
{
int i;
if(m_sign==-1)
std::cout<<"-";
for(i=m_len;i!=0;i--)
std::cout<<m_num[i]+0;
std::cout<<std::endl;
}
HugeInt::HugeInt(const int & ioperand)
{
memset(m_num,0,sizeof(char)*MAXLEN);
if(ioperand!=0)
{
if(ioperand>0)
m_sign=1;
else
m_sign=-1;
int i=0,k=1;
int abs_R=abs(ioperand);
do
{
i++;
m_num[i]=abs_R%10;
abs_R/=10;
}while(abs_R);
m_len=i;
}
else
{
m_num[1]=0;
m_len=1;
m_sign=1;
}
}
HugeInt HugeInt::operator +(HugeInt &hOperand)
{
if(this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp2.m_sign=1;
hTmp=hTmp1+hTmp2;
hTmp.m_sign=-1;
return hTmp;
}
else if(this->m_sign==-1 && hOperand.m_sign==1)
{
HugeInt hTmp1(*this),hTmp;
hTmp1.m_sign=1;
hTmp=hOperand-hTmp1;
return hTmp;
}
else if(this->m_sign==1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp=*this-hTmp1;
return hTmp;
}
else
{
HugeInt Result(0);
char *p,*q,*r;
p=q=r=NULL;
int len1,len2;
if(Len()>hOperand.Len())
{
p=this->m_num;
q=hOperand.m_num;
r=Result.m_num;
len1=Len();
len2=hOperand.Len();
}
else
{
p=hOperand.m_num;
q=this->m_num;
r=Result.m_num;
len1=hOperand.Len();
len2=Len();
}
int i=1,j=1,k=1,carry=0;
while(j<=len2)
{
r[k]=p[i++]+q[j++]+carry;
carry=r[k]/10;
r[k]%=10;
k++;
}
while(i<=len1)
{
r[k]=p[i++]+carry;
carry=r[k]/10;
r[k]%=10;
k++;
}
if(carry>0)
{
r[k]=carry;
Result.m_len=k;
}
else
{
Result.m_len=k-1;
}
Result.m_sign=1;
return Result;
}
}
HugeInt &HugeInt::operator +=(HugeInt &hoperand)
{
*this=*this+hoperand;
return *this;
}
HugeInt& HugeInt::operator ++()
{
*this=*this+1;
return *this;
}
HugeInt HugeInt::operator +(int ioperand)
{
HugeInt hInt(ioperand);
return (*this)+hInt;
}
void HugeInt::operator =(int iOperand)
{
if(iOperand!=0)
{
if(iOperand>0)
m_sign=1;
else
m_sign=-1;
int i=0,k=1;
int abs_R=abs(iOperand);
do
{
i++;
m_num[i]=abs_R%10;
abs_R/=10;
}while(abs_R);
m_len=i;
}
else
{
m_num[1]=0;
m_len=1;
m_sign=1;
}
}
HugeInt& HugeInt::operator +=(int R)
{
HugeInt hInt=R;
*this=*this+hInt;
return *this;
}
HugeInt HugeInt::operator *(HugeInt &R)
{
HugeInt Result=0;
Result.m_sign=this->m_sign*R.m_sign;
char *muti1,*muti2,*result=Result.m_num;
int len1,len2;
if(this->m_len>R.Len())
{
muti1=this->m_num;
muti2=R.m_num;
len1=this->m_len;
len2=R.m_len;
}
else
{
muti1=R.m_num;
muti2=this->m_num;
len2=this->m_len;
len1=R.m_len;
}
int i=1,j=1,k=1,carry=0;
while(j<=len2)
{
i=1;
k=j;
while(i<=len1)
{
result[k]+=muti1[i++]*muti2[j]+carry;
carry=result[k]/10;
result[k]%=10;
k++;
}
if(carry!=0)
{
result[k]+=carry;
Result.m_len=k;
carry=0;
}
else
{
Result.m_len=k-1;
}
j++;
}
return Result;
}
HugeInt HugeInt::operator *(int R)
{
HugeInt hInt=R;
return (*this)*hInt;
}
bool HugeInt::operator !=(HugeInt &R)
{
if(R.m_len==this->m_len&&R.m_sign==this->m_sign)
{
int i;
for(i=1;i<=this->m_len;i++)
if(m_num[i]!=R.m_num[i])
return true;
return false;
}
else
return true;
}
bool HugeInt::operator !=(const int &R)
{
HugeInt hInt(R);
if(hInt.m_len==this->m_len && hInt.m_sign==this->m_sign)
{
int i;
for(i=1;i<=this->m_len;i++)
if(m_num[i]!=hInt.m_num[i])
return true;
return false;
}
else
return true;
}
bool HugeInt::operator <=(HugeInt &R)
{
if(*this == R)
return true;
if (this->m_sign==-1 && R.m_sign==1)
{
return true;
}
else if (this->m_sign==1 && R.m_sign==-1)
{
return false;
}
else if (this->m_sign==-1 && R.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(R);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1<=hTmp2);
}
else
{
if(this->m_len==R.m_len)
{
int i=1;
for(i=R.m_len;i!=0;i--)
{
if(this->m_num[i]<R.m_num[i])
{
return true;
}
else if(this->m_num[i]>R.m_num[i])
return false;
}
return true;
}
else
{
if(this->m_len<R.m_len)
return true;
else
return false;
}
}
}
bool HugeInt::operator <=(const int &R)
{
HugeInt hInt=R;
return (*this)<=hInt;
}
HugeInt& HugeInt::operator *=(HugeInt &R)
{
*this=(*this)*R;
return *this;
}
HugeInt& HugeInt::operator *=(int R)
{
HugeInt hInt=R;
*this=*this*hInt;
return *this;
}
std::ostream& operator <<(std::ostream &out,HugeInt &R)
{
int i;
if(R.m_sign==-1)
out<<"-";
for(i=R.m_len;i!=0;i--)
out<<R.m_num[i]+0;
out<<std::endl;
return out;
}
bool HugeInt::operator <(HugeInt &hOperand)
{
if(this->m_sign==1 && hOperand.m_sign==1)
{
if(this->m_len==hOperand.m_len)
{
for (int i=m_len;i!=0;i--)
{
if(this->m_num[i]<hOperand.m_num[i])
return true;
else if(this->m_num[i]>hOperand.m_num[i])
return false;
}
return false;
}
else
{
if(this->m_len<hOperand.m_len)
return true;
else
return false;
}
}
else if(this->m_sign==1 && hOperand.m_sign==-1)
{
return false;
}
else if (this->m_sign==-1 && hOperand.m_sign==1)
{
return true;
}
else if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1<hTmp2);
}
return false;
}
HugeInt HugeInt::operator -(HugeInt &hOperand)
{
int iLen1,iLen2,i=1,j=1,k=1;
char *ptr1,*ptr2,*ptr3;
if (*this == hOperand)
{
HugeInt hTmp(0);
return hTmp;
}
if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp=*this+hTmp1;
hTmp.m_sign=-1;
return hTmp;
}
else if (this->m_sign==-1 && hOperand.m_sign==1)
{
HugeInt hTmp1(*this),hTmp2(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp2.m_sign=1;
hTmp=hTmp1+hTmp2;
hTmp.m_sign=-1;
return hTmp;
}
else if (this->m_sign==1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand);
hTmp1.m_sign=1;
return *this+hTmp1;
}
else
{
HugeInt hResult=0;
if((*this)<hOperand)
{
iLen2=this->m_len;
iLen1=hOperand.m_len;
ptr2=this->m_num;
ptr1=hOperand.m_num;
hResult.m_sign=-1;
}
else
{
iLen1=this->m_len;
iLen2=hOperand.m_len;
ptr1=this->m_num;
ptr2=hOperand.m_num;
hResult.m_sign=1;
}
ptr3=hResult.m_num;
while(j<=iLen2)
{
if(ptr1[i]<ptr2[j])
{
--ptr1[i+1];
ptr3[k]=ptr1[i]+10-ptr2[j];
}
else
{
ptr3[k]=ptr1[i]-ptr2[j];
}
i++;
j++;
k++;
}
while(i<=iLen1)
{
if(ptr1[i]<0)
{
--ptr1[i+1];
ptr3[k]=ptr1[i]+10;
}
else
{
ptr3[k]=ptr1[i];
}
k++;
i++;
}
for(int iCount=k;ptr3[iCount]==0;iCount--);
hResult.m_len=iCount;
return hResult;
}
}
HugeInt HugeInt::operator /(HugeInt &hOperand)
{
HugeInt hResult,h1=*this,tmp;
if(h1==hOperand)
{
hResult=1;
hResult.m_sign=1;
}
else if(h1<hOperand)
hResult=0;
else
{
int i1,i2,n;
hResult.m_sign=h1.m_sign*hOperand.m_sign;
while(hOperand<=h1)
{
i1=i2=h1.m_len;
n=1;
while(TakeHigh(h1,i1,i2)<=hOperand)
i2--;
if(TakeHigh(h1,i1,i2+1)==hOperand)
{
++i2;
}
if(hResult.m_len==0)
hResult.m_len=i2;
tmp=TakeHigh(h1,i1,i2);
while(hOperand*n<=tmp)
{
n++;
}
tmp=hOperand*(n-1);
h1=h1-FillTen(tmp,tmp.m_len,1,tmp.m_len+i2-1);
hResult.m_num[i2]+=n-1;
}
}
return hResult;
}
HugeInt HugeInt::TakeHigh(HugeInt &hInt,int start,int end)
{
HugeInt hResult=0;
hResult.m_len=start-end+1;
int i,j=hResult.m_len;
for(i=start;i>=end;i--,j--)
{
hResult.m_num[j]=hInt.m_num[i];
}
return hResult;
}
HugeInt HugeInt::FillTen(HugeInt &hInt,int start,int end,int len)
{
HugeInt hResult;
hResult.m_len=len;
int i=start,j=hResult.m_len;
while(i>=end)
{
hResult.m_num[j--]=hInt.m_num[i--];
}
return hResult;
}
void HugeInt::operator --()
{
*this=*this-1;
}
bool HugeInt::operator ==(HugeInt &hOperand)
{
if(this->m_len!=hOperand.m_len || this->m_sign!=hOperand.m_sign)
return false;
else
{
int i;
for(i=1;i<=hOperand.m_len;i++)
if(this->m_num[i]!=hOperand.m_num[i])
return false;
return true;
}
}
void HugeInt::operator =(HugeInt &hOperand)
{
this->m_len=hOperand.m_len;
this->m_sign=hOperand.m_sign;
memcpy(this->m_num,hOperand.m_num,sizeof(char)*MAXLEN);
}
HugeInt HugeInt::operator /(int iOperand)
{
HugeInt hInt(iOperand);
return *this/hInt;
}
HugeInt& HugeInt::operator /=(HugeInt &hOperand)
{
*this=*this/hOperand;
return *this;
}
HugeInt &HugeInt::operator /=(int iOperand)
{
HugeInt hTmp(iOperand);
*this=*this/hTmp;
return *this;
}
void HugeInt::operator ++(int)
{
*this=*this+1;
}
HugeInt HugeInt::operator -(int iOperand)
{
HugeInt hTmp(iOperand);
return *this-hTmp;
}
void HugeInt::operator -- (int)
{
*this=*this-1;
}
bool HugeInt::operator < (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this<hTmp;
}
bool HugeInt::operator >=(HugeInt &hOperand)
{
if(*this == hOperand)
return true;
if(this->m_sign==1 && hOperand.m_sign==-1)
return true;
else if(this->m_sign==-1 && hOperand.m_sign==1)
return false;
else if(this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1>=hTmp2);
}
else
{
if(this->m_len < hOperand.m_len)
return false;
else if(this->m_len > hOperand.m_len)
return true;
else
{
int i;
for(i=this->m_len;i!=0;i--)
{
if (this->m_num[i] > hOperand.m_num[i])
{
return true;
}
else if(this->m_num[i] < hOperand.m_num[i])
return false;
}
return true;
}
}
}
bool HugeInt::operator > (HugeInt &hOperand)
{
if (this->m_sign==1 && hOperand.m_sign==1)
{
if(this->m_len==hOperand.m_len)
{
for(int i=this->m_len;i!=0;i--)
if(this->m_num[i]>hOperand.m_num[i])
return true;
else if(this->m_num[i]<hOperand.m_num[i])
return false;
return false;
}
else
{
if(this->m_len > hOperand.m_len)
return true;
else
return false;
}
}
else if (this->m_sign==1 && hOperand.m_sign==-1)
{
return true;
}
else if(this->m_sign==-1 && hOperand.m_sign==1)
{
return false;
}
else if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
return !(hTmp1<hTmp2);
}
return false;
}
bool HugeInt::operator >= (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this >= hTmp;
}
bool HugeInt::operator > (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this > hTmp;
}
bool HugeInt::operator == (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this == hTmp;
}
void HugeInt::operator -= (HugeInt &hOperand)
{
*this=*this - hOperand;
}
void HugeInt::operator -= (const int &iOperand)
{
HugeInt hTmp(iOperand);
*this=*this - hTmp;
}
/*-------------------------------------------------------*
* CopyRight 2007 北京交通大学 *
*
* 最后修改日期:2007-4-7
*
* 文件名:HugeInt.cpp
*
* 描述:HugeInt类的实现文件,实现了四则运算
*
---------------------------------------------------------*/
#include "HugeInt.h"
#include <iostream>
#include <memory>
#include <cmath>
using namespace std;
HugeInt::HugeInt()
{
memset(m_num,0,sizeof(char)*MAXLEN);
m_sign=0;
m_len=0;
}
HugeInt::Print()
{
int i;
if(m_sign==-1)
std::cout<<"-";
for(i=m_len;i!=0;i--)
std::cout<<m_num[i]+0;
std::cout<<std::endl;
}
HugeInt::HugeInt(const int & ioperand)
{
memset(m_num,0,sizeof(char)*MAXLEN);
if(ioperand!=0)
{
if(ioperand>0)
m_sign=1;
else
m_sign=-1;
int i=0,k=1;
int abs_R=abs(ioperand);
do
{
i++;
m_num[i]=abs_R%10;
abs_R/=10;
}while(abs_R);
m_len=i;
}
else
{
m_num[1]=0;
m_len=1;
m_sign=1;
}
}
HugeInt HugeInt::operator +(HugeInt &hOperand)
{
if(this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp2.m_sign=1;
hTmp=hTmp1+hTmp2;
hTmp.m_sign=-1;
return hTmp;
}
else if(this->m_sign==-1 && hOperand.m_sign==1)
{
HugeInt hTmp1(*this),hTmp;
hTmp1.m_sign=1;
hTmp=hOperand-hTmp1;
return hTmp;
}
else if(this->m_sign==1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp=*this-hTmp1;
return hTmp;
}
else
{
HugeInt Result(0);
char *p,*q,*r;
p=q=r=NULL;
int len1,len2;
if(Len()>hOperand.Len())
{
p=this->m_num;
q=hOperand.m_num;
r=Result.m_num;
len1=Len();
len2=hOperand.Len();
}
else
{
p=hOperand.m_num;
q=this->m_num;
r=Result.m_num;
len1=hOperand.Len();
len2=Len();
}
int i=1,j=1,k=1,carry=0;
while(j<=len2)
{
r[k]=p[i++]+q[j++]+carry;
carry=r[k]/10;
r[k]%=10;
k++;
}
while(i<=len1)
{
r[k]=p[i++]+carry;
carry=r[k]/10;
r[k]%=10;
k++;
}
if(carry>0)
{
r[k]=carry;
Result.m_len=k;
}
else
{
Result.m_len=k-1;
}
Result.m_sign=1;
return Result;
}
}
HugeInt &HugeInt::operator +=(HugeInt &hoperand)
{
*this=*this+hoperand;
return *this;
}
HugeInt& HugeInt::operator ++()
{
*this=*this+1;
return *this;
}
HugeInt HugeInt::operator +(int ioperand)
{
HugeInt hInt(ioperand);
return (*this)+hInt;
}
void HugeInt::operator =(int iOperand)
{
if(iOperand!=0)
{
if(iOperand>0)
m_sign=1;
else
m_sign=-1;
int i=0,k=1;
int abs_R=abs(iOperand);
do
{
i++;
m_num[i]=abs_R%10;
abs_R/=10;
}while(abs_R);
m_len=i;
}
else
{
m_num[1]=0;
m_len=1;
m_sign=1;
}
}
HugeInt& HugeInt::operator +=(int R)
{
HugeInt hInt=R;
*this=*this+hInt;
return *this;
}
HugeInt HugeInt::operator *(HugeInt &R)
{
HugeInt Result=0;
Result.m_sign=this->m_sign*R.m_sign;
char *muti1,*muti2,*result=Result.m_num;
int len1,len2;
if(this->m_len>R.Len())
{
muti1=this->m_num;
muti2=R.m_num;
len1=this->m_len;
len2=R.m_len;
}
else
{
muti1=R.m_num;
muti2=this->m_num;
len2=this->m_len;
len1=R.m_len;
}
int i=1,j=1,k=1,carry=0;
while(j<=len2)
{
i=1;
k=j;
while(i<=len1)
{
result[k]+=muti1[i++]*muti2[j]+carry;
carry=result[k]/10;
result[k]%=10;
k++;
}
if(carry!=0)
{
result[k]+=carry;
Result.m_len=k;
carry=0;
}
else
{
Result.m_len=k-1;
}
j++;
}
return Result;
}
HugeInt HugeInt::operator *(int R)
{
HugeInt hInt=R;
return (*this)*hInt;
}
bool HugeInt::operator !=(HugeInt &R)
{
if(R.m_len==this->m_len&&R.m_sign==this->m_sign)
{
int i;
for(i=1;i<=this->m_len;i++)
if(m_num[i]!=R.m_num[i])
return true;
return false;
}
else
return true;
}
bool HugeInt::operator !=(const int &R)
{
HugeInt hInt(R);
if(hInt.m_len==this->m_len && hInt.m_sign==this->m_sign)
{
int i;
for(i=1;i<=this->m_len;i++)
if(m_num[i]!=hInt.m_num[i])
return true;
return false;
}
else
return true;
}
bool HugeInt::operator <=(HugeInt &R)
{
if(*this == R)
return true;
if (this->m_sign==-1 && R.m_sign==1)
{
return true;
}
else if (this->m_sign==1 && R.m_sign==-1)
{
return false;
}
else if (this->m_sign==-1 && R.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(R);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1<=hTmp2);
}
else
{
if(this->m_len==R.m_len)
{
int i=1;
for(i=R.m_len;i!=0;i--)
{
if(this->m_num[i]<R.m_num[i])
{
return true;
}
else if(this->m_num[i]>R.m_num[i])
return false;
}
return true;
}
else
{
if(this->m_len<R.m_len)
return true;
else
return false;
}
}
}
bool HugeInt::operator <=(const int &R)
{
HugeInt hInt=R;
return (*this)<=hInt;
}
HugeInt& HugeInt::operator *=(HugeInt &R)
{
*this=(*this)*R;
return *this;
}
HugeInt& HugeInt::operator *=(int R)
{
HugeInt hInt=R;
*this=*this*hInt;
return *this;
}
std::ostream& operator <<(std::ostream &out,HugeInt &R)
{
int i;
if(R.m_sign==-1)
out<<"-";
for(i=R.m_len;i!=0;i--)
out<<R.m_num[i]+0;
out<<std::endl;
return out;
}
bool HugeInt::operator <(HugeInt &hOperand)
{
if(this->m_sign==1 && hOperand.m_sign==1)
{
if(this->m_len==hOperand.m_len)
{
for (int i=m_len;i!=0;i--)
{
if(this->m_num[i]<hOperand.m_num[i])
return true;
else if(this->m_num[i]>hOperand.m_num[i])
return false;
}
return false;
}
else
{
if(this->m_len<hOperand.m_len)
return true;
else
return false;
}
}
else if(this->m_sign==1 && hOperand.m_sign==-1)
{
return false;
}
else if (this->m_sign==-1 && hOperand.m_sign==1)
{
return true;
}
else if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1<hTmp2);
}
return false;
}
HugeInt HugeInt::operator -(HugeInt &hOperand)
{
int iLen1,iLen2,i=1,j=1,k=1;
char *ptr1,*ptr2,*ptr3;
if (*this == hOperand)
{
HugeInt hTmp(0);
return hTmp;
}
if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp=*this+hTmp1;
hTmp.m_sign=-1;
return hTmp;
}
else if (this->m_sign==-1 && hOperand.m_sign==1)
{
HugeInt hTmp1(*this),hTmp2(hOperand),hTmp;
hTmp1.m_sign=1;
hTmp2.m_sign=1;
hTmp=hTmp1+hTmp2;
hTmp.m_sign=-1;
return hTmp;
}
else if (this->m_sign==1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(hOperand);
hTmp1.m_sign=1;
return *this+hTmp1;
}
else
{
HugeInt hResult=0;
if((*this)<hOperand)
{
iLen2=this->m_len;
iLen1=hOperand.m_len;
ptr2=this->m_num;
ptr1=hOperand.m_num;
hResult.m_sign=-1;
}
else
{
iLen1=this->m_len;
iLen2=hOperand.m_len;
ptr1=this->m_num;
ptr2=hOperand.m_num;
hResult.m_sign=1;
}
ptr3=hResult.m_num;
while(j<=iLen2)
{
if(ptr1[i]<ptr2[j])
{
--ptr1[i+1];
ptr3[k]=ptr1[i]+10-ptr2[j];
}
else
{
ptr3[k]=ptr1[i]-ptr2[j];
}
i++;
j++;
k++;
}
while(i<=iLen1)
{
if(ptr1[i]<0)
{
--ptr1[i+1];
ptr3[k]=ptr1[i]+10;
}
else
{
ptr3[k]=ptr1[i];
}
k++;
i++;
}
for(int iCount=k;ptr3[iCount]==0;iCount--);
hResult.m_len=iCount;
return hResult;
}
}
HugeInt HugeInt::operator /(HugeInt &hOperand)
{
HugeInt hResult,h1=*this,tmp;
if(h1==hOperand)
{
hResult=1;
hResult.m_sign=1;
}
else if(h1<hOperand)
hResult=0;
else
{
int i1,i2,n;
hResult.m_sign=h1.m_sign*hOperand.m_sign;
while(hOperand<=h1)
{
i1=i2=h1.m_len;
n=1;
while(TakeHigh(h1,i1,i2)<=hOperand)
i2--;
if(TakeHigh(h1,i1,i2+1)==hOperand)
{
++i2;
}
if(hResult.m_len==0)
hResult.m_len=i2;
tmp=TakeHigh(h1,i1,i2);
while(hOperand*n<=tmp)
{
n++;
}
tmp=hOperand*(n-1);
h1=h1-FillTen(tmp,tmp.m_len,1,tmp.m_len+i2-1);
hResult.m_num[i2]+=n-1;
}
}
return hResult;
}
HugeInt HugeInt::TakeHigh(HugeInt &hInt,int start,int end)
{
HugeInt hResult=0;
hResult.m_len=start-end+1;
int i,j=hResult.m_len;
for(i=start;i>=end;i--,j--)
{
hResult.m_num[j]=hInt.m_num[i];
}
return hResult;
}
HugeInt HugeInt::FillTen(HugeInt &hInt,int start,int end,int len)
{
HugeInt hResult;
hResult.m_len=len;
int i=start,j=hResult.m_len;
while(i>=end)
{
hResult.m_num[j--]=hInt.m_num[i--];
}
return hResult;
}
void HugeInt::operator --()
{
*this=*this-1;
}
bool HugeInt::operator ==(HugeInt &hOperand)
{
if(this->m_len!=hOperand.m_len || this->m_sign!=hOperand.m_sign)
return false;
else
{
int i;
for(i=1;i<=hOperand.m_len;i++)
if(this->m_num[i]!=hOperand.m_num[i])
return false;
return true;
}
}
void HugeInt::operator =(HugeInt &hOperand)
{
this->m_len=hOperand.m_len;
this->m_sign=hOperand.m_sign;
memcpy(this->m_num,hOperand.m_num,sizeof(char)*MAXLEN);
}
HugeInt HugeInt::operator /(int iOperand)
{
HugeInt hInt(iOperand);
return *this/hInt;
}
HugeInt& HugeInt::operator /=(HugeInt &hOperand)
{
*this=*this/hOperand;
return *this;
}
HugeInt &HugeInt::operator /=(int iOperand)
{
HugeInt hTmp(iOperand);
*this=*this/hTmp;
return *this;
}
void HugeInt::operator ++(int)
{
*this=*this+1;
}
HugeInt HugeInt::operator -(int iOperand)
{
HugeInt hTmp(iOperand);
return *this-hTmp;
}
void HugeInt::operator -- (int)
{
*this=*this-1;
}
bool HugeInt::operator < (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this<hTmp;
}
bool HugeInt::operator >=(HugeInt &hOperand)
{
if(*this == hOperand)
return true;
if(this->m_sign==1 && hOperand.m_sign==-1)
return true;
else if(this->m_sign==-1 && hOperand.m_sign==1)
return false;
else if(this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
hTmp1.m_sign=1;
hTmp2.m_sign=1;
return !(hTmp1>=hTmp2);
}
else
{
if(this->m_len < hOperand.m_len)
return false;
else if(this->m_len > hOperand.m_len)
return true;
else
{
int i;
for(i=this->m_len;i!=0;i--)
{
if (this->m_num[i] > hOperand.m_num[i])
{
return true;
}
else if(this->m_num[i] < hOperand.m_num[i])
return false;
}
return true;
}
}
}
bool HugeInt::operator > (HugeInt &hOperand)
{
if (this->m_sign==1 && hOperand.m_sign==1)
{
if(this->m_len==hOperand.m_len)
{
for(int i=this->m_len;i!=0;i--)
if(this->m_num[i]>hOperand.m_num[i])
return true;
else if(this->m_num[i]<hOperand.m_num[i])
return false;
return false;
}
else
{
if(this->m_len > hOperand.m_len)
return true;
else
return false;
}
}
else if (this->m_sign==1 && hOperand.m_sign==-1)
{
return true;
}
else if(this->m_sign==-1 && hOperand.m_sign==1)
{
return false;
}
else if (this->m_sign==-1 && hOperand.m_sign==-1)
{
HugeInt hTmp1(*this),hTmp2(hOperand);
return !(hTmp1<hTmp2);
}
return false;
}
bool HugeInt::operator >= (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this >= hTmp;
}
bool HugeInt::operator > (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this > hTmp;
}
bool HugeInt::operator == (const int &iOperand)
{
HugeInt hTmp(iOperand);
return *this == hTmp;
}
void HugeInt::operator -= (HugeInt &hOperand)
{
*this=*this - hOperand;
}
void HugeInt::operator -= (const int &iOperand)
{
HugeInt hTmp(iOperand);
*this=*this - hTmp;
}
/*-------------------------------------------------------* * CopyRight 2007 北京交通大学 * * * 最后修改日期:2007-4-7 * * 文件名:HugeInt.cpp * * 描述:HugeInt类的实现文件,实现了四则运算 * ---------------------------------------------------------*/ #include "HugeInt.h" #include <iostream> #include <memory> #include <cmath> using namespace std; HugeInt::HugeInt() { memset(m_num,0,sizeof(char)*MAXLEN); m_sign=0; m_len=0; } HugeInt::Print() { int i; if(m_sign==-1) std::cout<<"-"; for(i=m_len;i!=0;i--) std::cout<<m_num[i]+0; std::cout<<std::endl; } HugeInt::HugeInt(const int & ioperand) { memset(m_num,0,sizeof(char)*MAXLEN); if(ioperand!=0) { if(ioperand>0) m_sign=1; else m_sign=-1; int i=0,k=1; int abs_R=abs(ioperand); do { i++; m_num[i]=abs_R%10; abs_R/=10; }while(abs_R); m_len=i; } else { m_num[1]=0; m_len=1; m_sign=1; } } HugeInt HugeInt::operator +(HugeInt &hOperand) { if(this->m_sign==-1 && hOperand.m_sign==-1) { HugeInt hTmp1(*this),hTmp2(hOperand),hTmp; hTmp1.m_sign=1; hTmp2.m_sign=1; hTmp=hTmp1+hTmp2; hTmp.m_sign=-1; return hTmp; } else if(this->m_sign==-1 && hOperand.m_sign==1) { HugeInt hTmp1(*this),hTmp; hTmp1.m_sign=1; hTmp=hOperand-hTmp1; return hTmp; } else if(this->m_sign==1 && hOperand.m_sign==-1) { HugeInt hTmp1(hOperand),hTmp; hTmp1.m_sign=1; hTmp=*this-hTmp1; return hTmp; } else { HugeInt Result(0); char *p,*q,*r; p=q=r=NULL; int len1,len2; if(Len()>hOperand.Len()) { p=this->m_num; q=hOperand.m_num; r=Result.m_num; len1=Len(); len2=hOperand.Len(); } else { p=hOperand.m_num; q=this->m_num; r=Result.m_num; len1=hOperand.Len(); len2=Len(); } int i=1,j=1,k=1,carry=0; while(j<=len2) { r[k]=p[i++]+q[j++]+carry; carry=r[k]/10; r[k]%=10; k++; } while(i<=len1) { r[k]=p[i++]+carry; carry=r[k]/10; r[k]%=10; k++; } if(carry>0) { r[k]=carry; Result.m_len=k; } else { Result.m_len=k-1; } Result.m_sign=1; return Result; } } HugeInt &HugeInt::operator +=(HugeInt &hoperand) { *this=*this+hoperand; return *this; } HugeInt& HugeInt::operator ++() { *this=*this+1; return *this; } HugeInt HugeInt::operator +(int ioperand) { HugeInt hInt(ioperand); return (*this)+hInt; } void HugeInt::operator =(int iOperand) { if(iOperand!=0) { if(iOperand>0) m_sign=1; else m_sign=-1; int i=0,k=1; int abs_R=abs(iOperand); do { i++; m_num[i]=abs_R%10; abs_R/=10; }while(abs_R); m_len=i; } else { m_num[1]=0; m_len=1; m_sign=1; } } HugeInt& HugeInt::operator +=(int R) { HugeInt hInt=R; *this=*this+hInt; return *this; } HugeInt HugeInt::operator *(HugeInt &R) { HugeInt Result=0; Result.m_sign=this->m_sign*R.m_sign; char *muti1,*muti2,*result=Result.m_num; int len1,len2; if(this->m_len>R.Len()) { muti1=this->m_num; muti2=R.m_num; len1=this->m_len; len2=R.m_len; } else { muti1=R.m_num; muti2=this->m_num; len2=this->m_len; len1=R.m_len; } int i=1,j=1,k=1,carry=0; while(j<=len2) { i=1; k=j; while(i<=len1) { result[k]+=muti1[i++]*muti2[j]+carry; carry=result[k]/10; result[k]%=10; k++; } if(carry!=0) { result[k]+=carry; Result.m_len=k; carry=0; } else { Result.m_len=k-1; } j++; } return Result; } HugeInt HugeInt::operator *(int R) { HugeInt hInt=R; return (*this)*hInt; } bool HugeInt::operator !=(HugeInt &R) { if(R.m_len==this->m_len&&R.m_sign==this->m_sign) { int i; for(i=1;i<=this->m_len;i++) if(m_num[i]!=R.m_num[i]) return true; return false; } else return true; } bool HugeInt::operator !=(const int &R) { HugeInt hInt(R); if(hInt.m_len==this->m_len && hInt.m_sign==this->m_sign) { int i; for(i=1;i<=this->m_len;i++) if(m_num[i]!=hInt.m_num[i]) return true; return false; } else return true; } bool HugeInt::operator <=(HugeInt &R) { if(*this == R) return true; if (this->m_sign==-1 && R.m_sign==1) { return true; } else if (this->m_sign==1 && R.m_sign==-1) { return false; } else if (this->m_sign==-1 && R.m_sign==-1) { HugeInt hTmp1(*this),hTmp2(R); hTmp1.m_sign=1; hTmp2.m_sign=1; return !(hTmp1<=hTmp2); } else { if(this->m_len==R.m_len) { int i=1; for(i=R.m_len;i!=0;i--) { if(this->m_num[i]<R.m_num[i]) { return true; } else if(this->m_num[i]>R.m_num[i]) return false; } return true; } else { if(this->m_len<R.m_len) return true; else return false; } } } bool HugeInt::operator <=(const int &R) { HugeInt hInt=R; return (*this)<=hInt; } HugeInt& HugeInt::operator *=(HugeInt &R) { *this=(*this)*R; return *this; } HugeInt& HugeInt::operator *=(int R) { HugeInt hInt=R; *this=*this*hInt; return *this; } std::ostream& operator <<(std::ostream &out,HugeInt &R) { int i; if(R.m_sign==-1) out<<"-"; for(i=R.m_len;i!=0;i--) out<<R.m_num[i]+0; out<<std::endl; return out; } bool HugeInt::operator <(HugeInt &hOperand) { if(this->m_sign==1 && hOperand.m_sign==1) { if(this->m_len==hOperand.m_len) { for (int i=m_len;i!=0;i--) { if(this->m_num[i]<hOperand.m_num[i]) return true; else if(this->m_num[i]>hOperand.m_num[i]) return false; } return false; } else { if(this->m_len<hOperand.m_len) return true; else return false; } } else if(this->m_sign==1 && hOperand.m_sign==-1) { return false; } else if (this->m_sign==-1 && hOperand.m_sign==1) { return true; } else if (this->m_sign==-1 && hOperand.m_sign==-1) { HugeInt hTmp1(*this),hTmp2(hOperand); hTmp1.m_sign=1; hTmp2.m_sign=1; return !(hTmp1<hTmp2); } return false; } HugeInt HugeInt::operator -(HugeInt &hOperand) { int iLen1,iLen2,i=1,j=1,k=1; char *ptr1,*ptr2,*ptr3; if (*this == hOperand) { HugeInt hTmp(0); return hTmp; } if (this->m_sign==-1 && hOperand.m_sign==-1) { HugeInt hTmp1(hOperand),hTmp; hTmp1.m_sign=1; hTmp=*this+hTmp1; hTmp.m_sign=-1; return hTmp; } else if (this->m_sign==-1 && hOperand.m_sign==1) { HugeInt hTmp1(*this),hTmp2(hOperand),hTmp; hTmp1.m_sign=1; hTmp2.m_sign=1; hTmp=hTmp1+hTmp2; hTmp.m_sign=-1; return hTmp; } else if (this->m_sign==1 && hOperand.m_sign==-1) { HugeInt hTmp1(hOperand); hTmp1.m_sign=1; return *this+hTmp1; } else { HugeInt hResult=0; if((*this)<hOperand) { iLen2=this->m_len; iLen1=hOperand.m_len; ptr2=this->m_num; ptr1=hOperand.m_num; hResult.m_sign=-1; } else { iLen1=this->m_len; iLen2=hOperand.m_len; ptr1=this->m_num; ptr2=hOperand.m_num; hResult.m_sign=1; } ptr3=hResult.m_num; while(j<=iLen2) { if(ptr1[i]<ptr2[j]) { --ptr1[i+1]; ptr3[k]=ptr1[i]+10-ptr2[j]; } else { ptr3[k]=ptr1[i]-ptr2[j]; } i++; j++; k++; } while(i<=iLen1) { if(ptr1[i]<0) { --ptr1[i+1]; ptr3[k]=ptr1[i]+10; } else { ptr3[k]=ptr1[i]; } k++; i++; } for(int iCount=k;ptr3[iCount]==0;iCount--); hResult.m_len=iCount; return hResult; } } HugeInt HugeInt::operator /(HugeInt &hOperand) { HugeInt hResult,h1=*this,tmp; if(h1==hOperand) { hResult=1; hResult.m_sign=1; } else if(h1<hOperand) hResult=0; else { int i1,i2,n; hResult.m_sign=h1.m_sign*hOperand.m_sign; while(hOperand<=h1) { i1=i2=h1.m_len; n=1; while(TakeHigh(h1,i1,i2)<=hOperand) i2--; if(TakeHigh(h1,i1,i2+1)==hOperand) { ++i2; } if(hResult.m_len==0) hResult.m_len=i2; tmp=TakeHigh(h1,i1,i2); while(hOperand*n<=tmp) { n++; } tmp=hOperand*(n-1); h1=h1-FillTen(tmp,tmp.m_len,1,tmp.m_len+i2-1); hResult.m_num[i2]+=n-1; } } return hResult; } HugeInt HugeInt::TakeHigh(HugeInt &hInt,int start,int end) { HugeInt hResult=0; hResult.m_len=start-end+1; int i,j=hResult.m_len; for(i=start;i>=end;i--,j--) { hResult.m_num[j]=hInt.m_num[i]; } return hResult; } HugeInt HugeInt::FillTen(HugeInt &hInt,int start,int end,int len) { HugeInt hResult; hResult.m_len=len; int i=start,j=hResult.m_len; while(i>=end) { hResult.m_num[j--]=hInt.m_num[i--]; } return hResult; } void HugeInt::operator --() { *this=*this-1; } bool HugeInt::operator ==(HugeInt &hOperand) { if(this->m_len!=hOperand.m_len || this->m_sign!=hOperand.m_sign) return false; else { int i; for(i=1;i<=hOperand.m_len;i++) if(this->m_num[i]!=hOperand.m_num[i]) return false; return true; } } void HugeInt::operator =(HugeInt &hOperand) { this->m_len=hOperand.m_len; this->m_sign=hOperand.m_sign; memcpy(this->m_num,hOperand.m_num,sizeof(char)*MAXLEN); } HugeInt HugeInt::operator /(int iOperand) { HugeInt hInt(iOperand); return *this/hInt; } HugeInt& HugeInt::operator /=(HugeInt &hOperand) { *this=*this/hOperand; return *this; } HugeInt &HugeInt::operator /=(int iOperand) { HugeInt hTmp(iOperand); *this=*this/hTmp; return *this; } void HugeInt::operator ++(int) { *this=*this+1; } HugeInt HugeInt::operator -(int iOperand) { HugeInt hTmp(iOperand); return *this-hTmp; } void HugeInt::operator -- (int) { *this=*this-1; } bool HugeInt::operator < (const int &iOperand) { HugeInt hTmp(iOperand); return *this<hTmp; } bool HugeInt::operator >=(HugeInt &hOperand) { if(*this == hOperand) return true; if(this->m_sign==1 && hOperand.m_sign==-1) return true; else if(this->m_sign==-1 && hOperand.m_sign==1) return false; else if(this->m_sign==-1 && hOperand.m_sign==-1) { HugeInt hTmp1(*this),hTmp2(hOperand); hTmp1.m_sign=1; hTmp2.m_sign=1; return !(hTmp1>=hTmp2); } else { if(this->m_len < hOperand.m_len) return false; else if(this->m_len > hOperand.m_len) return true; else { int i; for(i=this->m_len;i!=0;i--) { if (this->m_num[i] > hOperand.m_num[i]) { return true; } else if(this->m_num[i] < hOperand.m_num[i]) return false; } return true; } } } bool HugeInt::operator > (HugeInt &hOperand) { if (this->m_sign==1 && hOperand.m_sign==1) { if(this->m_len==hOperand.m_len) { for(int i=this->m_len;i!=0;i--) if(this->m_num[i]>hOperand.m_num[i]) return true; else if(this->m_num[i]<hOperand.m_num[i]) return false; return false; } else { if(this->m_len > hOperand.m_len) return true; else return false; } } else if (this->m_sign==1 && hOperand.m_sign==-1) { return true; } else if(this->m_sign==-1 && hOperand.m_sign==1) { return false; } else if (this->m_sign==-1 && hOperand.m_sign==-1) { HugeInt hTmp1(*this),hTmp2(hOperand); return !(hTmp1<hTmp2); } return false; } bool HugeInt::operator >= (const int &iOperand) { HugeInt hTmp(iOperand); return *this >= hTmp; } bool HugeInt::operator > (const int &iOperand) { HugeInt hTmp(iOperand); return *this > hTmp; } bool HugeInt::operator == (const int &iOperand) { HugeInt hTmp(iOperand); return *this == hTmp; } void HugeInt::operator -= (HugeInt &hOperand) { *this=*this - hOperand; } void HugeInt::operator -= (const int &iOperand) { HugeInt hTmp(iOperand); *this=*this - hTmp; }
main
#include <iostream>
#include <fstream>
#include <conio.h>
#include "HugeInt.h"
using namespace std;
int main()
{
ofstream out("result.txt");
HugeInt result=1;
HugeInt i=-10,j=2;
int k=1;
cout<<"\n程序名称:HugeInt类\n作用:2000位大数的四则运算\n日期:2007年4月\n北京交通大学 "<<endl;
cout<<endl<<"开始对HugeInt类进行测试.."<<endl<<endl;
//测试100!(乘法测试)
result=1;
for(i=1;i<=100;i++)
result *= i;
cout<<"测试乘法:\n100!="<<result<<endl;
//把100!结果写入到文件result.txt中的测试
cout<<"测试文件流及重载<<:\n100!的结果已经写入result.txt"<<endl<<endl;
out<<result;
//测试除法
for(i=100;i!=0;i--)
result/=i;
cout<<"测试除法:\n100!/100/99/98.../1="<<result<<endl;
//测试-1+-2+..-100
result=0;
for(i=-1;i>=-100;i--)
result+=i;
cout<<"测试加法:\n-1 + -2 + -3 + ... + -100="<<result<<endl;
//测试减法
result=9999;
result-=99999;
cout<<"测试减法:\n9999 - 99999="<<result;
cout<<"按任一键退出。";
getch();
return 0;
}
#include <iostream>
#include <fstream>
#include <conio.h>
#include "HugeInt.h"
using namespace std;
int main()
{
ofstream out("result.txt");
HugeInt result=1;
HugeInt i=-10,j=2;
int k=1;
cout<<"\n程序名称:HugeInt类\n作用:2000位大数的四则运算\n日期:2007年4月\n北京交通大学 "<<endl;
cout<<endl<<"开始对HugeInt类进行测试.."<<endl<<endl;
//测试100!(乘法测试)
result=1;
for(i=1;i<=100;i++)
result *= i;
cout<<"测试乘法:\n100!="<<result<<endl;
//把100!结果写入到文件result.txt中的测试
cout<<"测试文件流及重载<<:\n100!的结果已经写入result.txt"<<endl<<endl;
out<<result;
//测试除法
for(i=100;i!=0;i--)
result/=i;
cout<<"测试除法:\n100!/100/99/98.../1="<<result<<endl;
//测试-1+-2+..-100
result=0;
for(i=-1;i>=-100;i--)
result+=i;
cout<<"测试加法:\n-1 + -2 + -3 + ... + -100="<<result<<endl;
//测试减法
result=9999;
result-=99999;
cout<<"测试减法:\n9999 - 99999="<<result;
cout<<"按任一键退出。";
getch();
return 0;
}
#include <iostream> #include <fstream> #include <conio.h> #include "HugeInt.h" using namespace std; int main() { ofstream out("result.txt"); HugeInt result=1; HugeInt i=-10,j=2; int k=1; cout<<"\n程序名称:HugeInt类\n作用:2000位大数的四则运算\n日期:2007年4月\n北京交通大学 "<<endl; cout<<endl<<"开始对HugeInt类进行测试.."<<endl<<endl; //测试100!(乘法测试) result=1; for(i=1;i<=100;i++) result *= i; cout<<"测试乘法:\n100!="<<result<<endl; //把100!结果写入到文件result.txt中的测试 cout<<"测试文件流及重载<<:\n100!的结果已经写入result.txt"<<endl<<endl; out<<result; //测试除法 for(i=100;i!=0;i--) result/=i; cout<<"测试除法:\n100!/100/99/98.../1="<<result<<endl; //测试-1+-2+..-100 result=0; for(i=-1;i>=-100;i--) result+=i; cout<<"测试加法:\n-1 + -2 + -3 + ... + -100="<<result<<endl; //测试减法 result=9999; result-=99999; cout<<"测试减法:\n9999 - 99999="<<result; cout<<"按任一键退出。"; getch(); return 0; }