为实现一个不会溢出的四则运算计算器,我们需要将数据存入字符串中,并自己实现加减乘除的逻辑。
存储结构设计:
为了方便计算,将符号位,整数部分,小数部分分别存储
enum SIGN
{
POSITIVE,
NEGATIVE
};
class Num
{
protected:
SIGN _sign; //符号位
string _int; //整数位
string _float; //小数位
public:
Num()
:_sign(POSITIVE)
{}
}
分别重载常见运算符,并定义拷贝构造函数
bool operator>(Num& a)
{
if(IsZero(*this)&&IsZero(a))
return false;
if(_sign==NEGATIVE&&a._sign==POSITIVE)
return false;
else if(_sign==POSITIVE&&a._sign==NEGATIVE)
return true;
if(_sign==POSITIVE&&a._sign==POSITIVE)
{
if(_int.length()>a._int.length())
return true;
else if(_int.length()<a._int.length())
return false;
else if(_int.length()==a._int.length())
{
if(strcmp(_int.c_str(),a._int.c_str())<0)
return false;
else if(strcmp(_int.c_str(),a._int.c_str())>0)
return true;
else if(strcmp(_int.c_str(),a._int.c_str())==0)
{
string::iterator it1=_float.begin();
string::iterator it2=a._float.begin();
while(it1!=_float.end()&&it2!=a._float.end())
{
if(*it1<*it2)
return false;
it1++;
it2++;
}
while(it2!=a._float.end())
{
return false;
}
while(it1!=_float.end())
{
return true;
}
}
return false;
}
}
if(_sign==NEGATIVE&&a._sign==NEGATIVE)
{
if(_int.length()>a._int.length())
return false;
else if(_int.length()<a._int.length())
return true;
else if(_int.length()==a._int.length())
{
if(strcmp(_int.c_str(),a._int.c_str())<0)
return true;
else if(strcmp(_int.c_str(),a._int.c_str())>0)
return false;
else if(strcmp(_int.c_str(),a._int.c_str())==0)
{
string::iterator it1=_float.begin();
string::iterator it2=a._float.begin();
while(it1!=_float.end()&&it2!=a._float.end())
{
if(*it1<*it2)
return true;
else if(*it1>*it2)
return false;
it1++;
it2++;
}
while(it1!=_float.end())
{
return false;
}
while(it2!=a._float.end())
return true;
}
return false;
}
}
return true;
}
bool operator==(Num& a)
{
if(IsZero(*this)&&IsZero(a))
return true;
if(_sign==NEGATIVE&&a._sign==POSITIVE)
return false;
else if(_sign==POSITIVE&&a._sign==NEGATIVE)
return false;
if(_int.length()!=a._int.length()||_float.length()!=a._float.length())
return false;
else if(_int.length()==a._int.length()&&strcmp((_int.c_str()),a._int.c_str())!=0)
return false;
else if(_float.length()==a._float.length()&&strcmp((_float.c_str()),a._float.c_str())!=0)
return false;
return true;
}
bool operator<(Num& a)
{
return !(*this>a||*this==a);
}
bool operator>=(Num& a)
{
return *this>a||*this==a;
}
bool operator<=(Num& a)
{
return *this<a||*this==a;
}
Num& operator=(Num a)
{
_float=a._float;
_int=a._int;
_sign=a._sign;
return *this;
}
Num(Num& a)
{
_sign=a._sign;
_int=a._int;
_float=a._float;
}
实现加法部分的逻辑
思路:
1.区别同号,异号相加
2.同号相加:从小数部分开始