return0;
}
四、完成如下类的设计(25分)在GCC编译系统中,unsignedlonglong数据类型使整型数的取值范围得到扩展(
,即0~18446744073709551615)。
为了进一步扩展非负整数的取值范围设计了如下的类。
该类数据可精确计算至
,可处理36~37位非负十进制整数。
请在类的声明体外实现5个尚未定义的成员函数或友元函数。
最后写出程序的运行结果(每个函数定义4分,运行结果5分)。
//LLINT.h头文件
#ifndefLLINT_H
#defineLLINT_H
#include
usingnamespacestd;
classLLINT
{
public:
LLINT(unsignedlonglongx0=0,unsignedlonglongx1=0);
//第一参数为低位
LLINT(constchar*str);
LLINT&operator++();
LLINToperator++(int);
friendLLINToperator+(constLLINT&x1,constLLINT&x2);
LLINT&operator+=(constLLINT&x);
friendostream&operator<<(ostream&out,constLLINT&x);
friendLLINTatoLLINT(constchar*str);
friendistream&operator>>(istream&in,LLINT&x);
friendbooloperator>(constLLINT&x1,constLLINT&x2);
friendbooloperator>=(constLLINT&x1,constLLINT&x2);
friendbooloperator<(constLLINT&x1,constLLINT&x2);
friendbooloperator<=(constLLINT&x1,constLLINT&x2);
friendbooloperator==(constLLINT&x1,constLLINT&x2);
friendbooloperator!
=(constLLINT&x1,constLLINT&x2);
protected:
staticconstunsignedlonglongBBILLION;
unsignedlonglonga1,a0;
//a1*1000000000000000000+a0可表示36~37位十进制非负整数
};
#endif
//LLINT.cpp源程序文件
#include"LLINT.h"
#include
constunsignedlonglongLLINT:
:
BBILLION=1000000000000000000ULL;
//静态常量数据成员的定义及初始化(10^18)
LLINT:
:
LLINT(unsignedlonglongx0,unsignedlonglongx1)
{//构造函数
unsignedlonglongx=x0/BBILLION;
a0=x0%BBILLION;
a1=x1+x;
}
LLINT:
:
LLINT(constchar*str)//转换构造函数(从C-字符串转换)
{
*this=atoLLINT(str);//直接利用成员函数实现转换构造
}
LLINTLLINT:
:
operator++(int)//后增量运算符函数
{
LLINTtemp(*this);
++(*this);
returntemp;
}
LLINToperator+(constLLINT&x1,constLLINT&x2)
{
LLINTs;
unsignedlonglongc=x1.a0+x2.a0;
s.a0=c%LLINT:
:
BBILLION;
s.a1=x1.a1+x2.a1+c/LLINT:
:
BBILLION;
returns;
}
ostream&operator<<(ostream&out,constLLINT&x)
{
if(x.a1!
=0)
out<else
out<returnout;
}
istream&operator>>(istream&in,LLINT&x)
{
charstr[200];
in>>str;
x=atoLLINT(str);
returnin;
}
booloperator>(constLLINT&x1,constLLINT&x2)
{
if(x1.a1>x2.a1)
returntrue;
elseif(x1.a1==x2.a1)
returnx1.a0>x2.a0;
else
returnfalse;
}
booloperator<(constLLINT&x1,constLLINT&x2)
{
if(x1.a1returntrue;
elseif(x1.a1==x2.a1)
returnx1.a0else
returnfalse;
}
booloperator<=(constLLINT&x1,constLLINT&x2)
{
if(x1.a1returntrue;
elseif(x1.a1==x2.a1)
returnx1.a0<=x2.a0;
else
returnfalse;
}
LLINTatoLLINT(constchar*str)
{
LLINTx;
inti,j=0,n;
unsignedlonglongp0=1,p1=1;
for(n=0;str[n];n++)
;
if(n==0)returnx;
for(i=n-1;i>=0;i--)
{
if('0'<=str[i]&&str[i]<='9')
{
if(j<18)
{
x.a0+=p0*(str[i]-'0');
p0*=10;
}
elseif(j<36)
{
x.a1+=p1*(str[i]-'0');
p1*=10;
}
j++;
}
}
returnx;
}
//LLINT_test.cpp测试程序
#include"LLINT.h"
intmain()
{
LLINTx("888777666555444333234567890987654321"),
y(100),z;
cout<z="999999999999999999";
cout<cout<运行结果
888777666555444333234567890987654321
100
0
999999999999999999
1000000000000000000
return0;
}
//请在类模板体外定义成员函数及友元函数。
【提示】可充分利用已有的函数。
//①(4分)前增量运算符函数重载
LLINT&LLINT:
:
operator++()
{
a0++;
if(a0==BBILLION)
{
a0=0;
a1++;
}
return*this;
}
//②(4分)加赋值运算符函数重载
LLINT&LLINT:
:
operator+=(constLLINT&x)
{
*this=*this+x;
return*this;
}
//③(4分)关系运算符(大于或等于)函数重载
booloperator>=(constLLINT&x1,constLLINT&x2)
{
if(x1.a1>x2.a1)
returntrue;
elseif(x1.a1==x2.a1)
returnx1.a0>=x2.a0;
else
returnfalse;
}
//④(4分)关系运算符(等于)函数重载
booloperator==(constLLINT&x1,constLLINT&x2)
{
return(x1.a1==x2.a1)&&(x1.a0==x2.a0);
}
//⑤(4分)关系运算符(不等于)函数重载
booloperator!
=(constLLINT&x1,constLLINT&x2)
{
return(x1.a1!
=x2.a1)||(x1.a0!
=x2.a0);
}