📄 rational.h
字号:
#if!defined(RATIONAL_H)
#define RATIONAL_H
#include<iostream>
#include<stdlib.h>
using namespace std;
namespace std
{
class Rational
{
private:
long num,den;
void Standardize(void);
long gcd(long m,long n)const;
public:
Rational(long p=0,long q=1);
Rational(double x);
friend istream& operator>>(istream& istr,Rational& x);
friend ostream& operator<<(ostream& ostr,const Rational& x);
Rational operator+(Rational& x)const;
Rational operator-(Rational& x)const;
Rational operator*(Rational& x)const;
Rational operator/(Rational& x)const;
Rational operator-(void)const;
int operator<(Rational& x)const;
int operator<=(Rational& x)const;
int operator==(Rational& x)const;
int operator!=(Rational& x)const;
int operator>(Rational& x)const;
int operator>=(Rational& x)const;
operator double(void)const;
int GetNumerator(void) const{return num;}
int GetDenominator(void) const{return den;}
void Reduce(void);
};
Rational::Rational(long p,long q):num(p),den(q)
{
if(den==0)
{
cerr<<"A Zero denominator is invalid"<<endl;
exit(1);
}
Standardize();
Reduce();
}
Rational::Rational(double x)
{
double val1,val2;
val1=100000000L*x;
val2=10000000L*x;
num=long(val1-val2);
den=90000000L;
Reduce();
}
void Rational::Standardize(void)
{
if(den<0)
{
num=-num;
den=-den;
}
}
long Rational::gcd(long m,long n)const
{
static long x;
if(m>n)
{
if(n==0) x=m;
else gcd(n,m%n);
}
else
{
if(m==0) x=n;
else gcd(m,n%m);
}
return x;
}
istream& operator>>(istream& istr,Rational& x)
{
char c;
istr>>x.num>>c>>x.den;
if(x.den==0)
{
cerr<<"A Zero denominator is invalid"<<endl;
exit(1);
}
x.Standardize();
x.Reduce();
return istr;
}
ostream& operator<<(ostream& ostr,const Rational& x)
{
ostr<<x.num<<'/'<<x.den;
return ostr;
}
Rational Rational::operator+(Rational& x)const
{
Rational temp=Rational(num*x.den+den*x.num,den*x.den);
temp.Reduce();
return temp;
}
Rational Rational::operator-(Rational& x)const
{
Rational temp=Rational(num*x.den-den*x.num,den*x.den);
temp.Reduce();
return temp;
}
Rational Rational::operator*(Rational& x)const
{
Rational temp=Rational(num*x.num,den*x.den);
temp.Reduce();
return temp;
}
Rational Rational::operator/(Rational& x)const
{
Rational temp=Rational(num*x.den,den*x.num);
temp.Standardize();
temp.Reduce();
return temp;
}
Rational Rational::operator-(void) const
{
return Rational(-num,den);
}
int Rational::operator<(Rational& x)const
{
return(num*x.den<den*x.num);
}
int Rational::operator<=(Rational& x)const
{
return(num*x.den<=den*x.num);
}
int Rational::operator==(Rational& x)const
{
return(num*x.den==den*x.num);
}
int Rational::operator!=(Rational& x)const
{
return(num*x.den!=den*x.num);
}
int Rational::operator>(Rational& x)const
{
return(num*x.den>den*x.num);
}
int Rational::operator>=(Rational& x)const
{
return(num*x.den>=den*x.num);
}
Rational::operator double(void)const
{
return double(num)/den;
}
void Rational::Reduce(void)
{
long bigdivisor,tempnumerator;
tempnumerator=(num<0) ? -num:num;
if(num==0)
den=1;
else
{
bigdivisor=gcd(tempnumerator,den);
if(bigdivisor>1)
{
num/=bigdivisor;
den/=bigdivisor;
}
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -