//分数
//2010.11.15 陈楠
#include <iostream.h>
#include<math.h>
class Rational
{
friend ostream& operator<<(ostream&,Rational); // 输出
friend Rational operator+(Rational,Rational);
friend Rational operator-(Rational,Rational);
friend Rational operator*(Rational,Rational);
friend Rational operator/(Rational,Rational);
friend int operator<(Rational,Rational); // <
friend int operator>(Rational,Rational); // >
friend int operator<=(Rational,Rational); // <=
friend int operator>=(Rational,Rational); // >=
friend int operator==(Rational,Rational); // ==
friend int operator!=(Rational,Rational); // !=
public:
Rational(int=0,int=1);
private:
int numerator,denominator; // 分子和分母
void simplify(); // 工具函数,进行化简
};
void Rational::simplify()
{
if (numerator==0)
{
denominator=1;
return;
}
long gcd=abs(numerator)>abs(denominator)?abs(denominator):abs(numerator);
if (gcd==0) return;
do
{
if (gcd==1)
break;
if(numerator%gcd==0 && denominator%gcd==0)
break;
else
gcd--;
} while(true);
numerator/=gcd;
denominator/=gcd;
if (numerator<0 && denominator<0)//denominator cannot be <=0
{
numerator=-numerator;
denominator=-denominator;
}
else if (numerator<0 || denominator<0)
{
numerator=-abs(numerator);
denominator=abs(denominator);
}
}
Rational::Rational(int int1, int int2)
{
numerator=int1;
denominator=int2;
simplify();
}
Rational operator+(Rational num1, Rational num2)
{
int n,d;
n = num1.numerator * num2.denominator + num1.denominator * num2.numerator;
d = num1.denominator * num2.denominator;
return Rational(n,d);
}
Rational operator-(Rational num1, Rational num2)
{
int n,d;
n = num1.numerator * num2.denominator - num1.denominator * num2.numerator;
d = num1.denominator * num2.denominator;
return Rational(n,d);
}
Rational operator*(Rational num1, Rational num2)
{
int n,d;
n = num1.numerator * num2.numerator;
d = num1.denominator * num2.denominator;
return Rational(n,d);
}
Rational operator/(Rational num1, Rational num2)
{
int n,d;
if (num2.numerator)
{
n = num1.numerator * num2.denominator;
d = num1.denominator* num2.numerator;
}
return Rational(n,d);
}
ostream& operator<<(ostream& output,Rational num)
{
return output << num.numerator << '/' << num.denominator;
}
int operator<(Rational num1, Rational num2)
{
Rational temp=num1-num2;
if (temp.numerator<0)
return 1;
else
return 0;
}
int operator>(Rational num1, Rational num2)
{
Rational temp=num1-num2;
if (temp.numerator>0)
return 1;
else
return 0;
}
int operator<=(Rational num1, Rational num2)
{
return num1<num2 || num1==num2;
}
int operator>=(Rational num1, Rational num2)
{
return num1>num2 || num1==num2;
}
int operator==(Rational num1, Rational num2)
{
Rational temp=num1-num2;
if (temp.numerator==0)
return 1;
else
return 0;
}
int operator!=(Rational num1, Rational num2)
{
return !(num1==num2);
}
// 测试类Rational
int main()
{
Rational r1(3,5),
r2(2,4),
r3;
cout << "The initial value of r1 is " << r1 << endl;
cout << "The initial value of r2 is " << r2 << endl;
cout << "The initial value of r3 is " << r3 << endl;
cout << "r1 + r2 : " << r1 + r2 << endl;
cout << "r1 - r2 : " << r1 - r2 << endl;
cout << "r1 * r2 : " << r1 * r2 << endl;
cout << "r1 / r2 : " << r1 / r2 << endl;
cout << "r1 < r2 : " << (r1<r2) << endl;
cout << "r1 > r2 : " << (r1>r2) << endl;
cout << "r1 <=r2 : " << (r1<=r2) << endl;
cout << "r1 >=r2 : " << (r1>=r2) << endl;
cout << "r1==r2 : " << (r1==r2) << endl;
cout << "r1!=r2 : " << (r1!=r2) << endl;
cout << "r1 < r1 : " << (r1<r1) << endl;
cout << "r1 > r1 : " << (r1>r1) << endl;
cout << "r1 <=r1 : " << (r1<=r1) << endl;
cout << "r1 >=r1 : " << (r1>=r1) << endl;
cout << "r1==r1 : " << (r1==r1) << endl;
cout << "r1!=r1 : " << (r1!=r1) << endl;
return 0;
}