#include <iostream>
#include <cstdlib>
using namespace std;
class Fraction
{
public:
Fraction()
{
denominator = 1;
numerator = 0;
}
Fraction(int numerator, int denominator);
void set(int numerator, int denominator);
void get(int &numerator, int &denominator) const;
Fraction operator+(const Fraction &rhs) const;
Fraction operator+(int rhs) const;
Fraction operator*(const Fraction &rhs) const;
Fraction operator*(int rhs) const;
Fraction operator-(const Fraction &rhs) const;
Fraction operator-(int rhs) const;
Fraction operator/(const Fraction &rhs) const;
Fraction operator/(int rhs) const;
friend ostream & operator<<(ostream &os, const Fraction &fraction);
private:
int numerator, denominator;
void normalize();
};
void Fraction::set(int numerator, int denominator)
{
if (denominator == 0)
{
cerr << "·Öĸ²»ÄÜΪ0£¡" << endl;
abort();
}
else
{
this -> numerator = numerator;
this -> denominator = denominator;
normalize();
}
}
Fraction::Fraction(int numerator, int denominator)
{
set(numerator, denominator);
}
void Fraction::normalize()
{
if (denominator < 0)
{
denominator = -denominator;
numerator = -numerator;
}
int temp1 = abs(denominator);
int temp2 = abs(numerator);
if (temp1 < temp2)
{
temp1 = temp1 ^ temp2;
temp2 = temp1 ^ temp2;
temp1 = temp1 ^ temp2;
}
int mod;
while ((mod = (temp1 % temp2)) != 0)
{
temp1 = temp2;
temp2 = mod;
}
denominator /= temp2;
numerator /= temp2;
}
ostream & operator<<(ostream &os, const Fraction &fraction)
{
os << fraction.numerator << "/" << fraction.denominator;
}
Fraction Fraction::operator+(const Fraction &rhs) const
{
int rhsN, rhsD;
rhs.get(rhsN, rhsD);
Fraction result(numerator * rhsD + denominator * rhsN, rhsD * denominator);
return result;
}
Fraction Fraction::operator+(int rhs) const
{
return *this + Fraction(rhs, 1);
}
Fraction operator+(int lhs, const Fraction &rhs)
{
return rhs + lhs;
}
Fraction operator*(int lhs, const Fraction &rhs)
{
return rhs * lhs;
}
Fraction operator-(int lhs, const Fraction &rhs)
{
return Fraction(lhs, 1) - rhs;
}
Fraction operator/(int lhs, const Fraction &rhs)
{
return Fraction(lhs, 1) / rhs;
}
void Fraction::get(int &numerator, int &denominator) const
{
numerator = this -> numerator;
denominator = this -> denominator;
}
Fraction Fraction::operator*(const Fraction &rhs) const
{
int rhsN, rhsD;
rhs.get(rhsN, rhsD);
Fraction result(numerator * rhsN, denominator * rhsD);
return result;
}
Fraction Fraction::operator*(int rhs) const
{
return *this * Fraction(rhs, 1);
}
Fraction Fraction::operator-(const Fraction &rhs) const
{
int rhsN, rhsD;
rhs.get(rhsN, rhsD);
return *this + Fraction(-rhsN, rhsD);
}
Fraction Fraction::operator-(int rhs) const
{
return *this - Fraction(rhs, 1);
}
Fraction Fraction::operator/(const Fraction &rhs) const
{
int rhsN, rhsD;
rhs.get(rhsN, rhsD);
return *this * Fraction(rhsD, rhsN);
}
Fraction Fraction::operator/(int rhs) const
{
return *this / Fraction(rhs, 1);
}
int main()
{
Fraction fraction(27, 18);
cout << fraction << endl;
cout << Fraction(4, 16) << endl;
cout << Fraction(2, 3) + Fraction(5, 6)<< endl;
cout << Fraction(2, 3) + 5 << endl;
cout << 5 + Fraction(2, 3) << endl;
cout << 2 - Fraction(2, 3) - 2 << endl;
cout << Fraction(6, 8) / 2 << endl;
cout << 3 / Fraction(7, 9) << endl;
return 0;
}