Last active
February 14, 2023 00:02
-
-
Save pwxcoo/bff885923b32ec5d3a1d16286f9efd89 to your computer and use it in GitHub Desktop.
Fraction implement by C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
#include <cstring> | |
#include <iostream> | |
#include <stdexcept> | |
using namespace std; | |
class Fraction { | |
int numerator; | |
int denominator; | |
public: | |
Fraction(int n, int d); | |
~Fraction(); | |
Fraction operator+(const Fraction& f); | |
Fraction operator-(const Fraction& f); | |
Fraction operator*(const Fraction& f); | |
Fraction operator/(const Fraction& f); | |
Fraction operator+=(const Fraction& f); | |
Fraction operator++(); | |
Fraction operator++(int); | |
bool operator>(const Fraction& f); | |
bool operator==(const Fraction& f); | |
operator double(); | |
friend ostream &operator<<(ostream &output, const Fraction& f); | |
private: | |
void simplify() { | |
reduction(); | |
fix_sign(); | |
} | |
void fix_sign() { | |
if (denominator < 0) { | |
denominator = -denominator; | |
numerator = -numerator; | |
} | |
} | |
void reduction() { | |
int common = gcd(numerator, denominator); | |
numerator /= common; | |
denominator /= common; | |
} | |
int gcd(int x, int y) { | |
return y == 0 ? x : gcd(y, x % y); | |
} | |
}; | |
Fraction::Fraction(int n, int d) { | |
if (d == 0) throw invalid_argument("d"); | |
numerator = n; | |
denominator = d; | |
simplify(); | |
} | |
Fraction::~Fraction() {} | |
Fraction Fraction::operator+(const Fraction& f) { | |
int n = numerator * f.denominator + f.numerator * denominator; | |
int d = denominator * f.denominator; | |
Fraction ff(n, d); | |
return ff; | |
} | |
Fraction Fraction::operator-(const Fraction& f) { | |
int n = numerator * f.denominator - f.numerator * denominator; | |
int d = denominator * f.denominator; | |
Fraction ff(n, d); | |
return ff; | |
} | |
Fraction Fraction::operator*(const Fraction& f) { | |
int n = numerator * f.numerator; | |
int d = denominator * f.denominator; | |
Fraction ff(n, d); | |
return ff; | |
} | |
Fraction Fraction::operator/(const Fraction& f) { | |
int n = numerator * f.denominator; | |
int d = denominator * f.numerator; | |
Fraction ff(n, d); | |
return ff; | |
} | |
Fraction Fraction::operator+=(const Fraction& f) { | |
numerator = numerator * f.denominator + f.numerator * denominator; | |
denominator = denominator * f.denominator; | |
simplify(); | |
Fraction ff(numerator, denominator); | |
return ff; | |
} | |
Fraction Fraction::operator++() { | |
Fraction f(1, 1); | |
numerator = numerator * f.denominator + f.numerator * denominator; | |
denominator = denominator * f.denominator; | |
simplify(); | |
Fraction ff(numerator, denominator); | |
return ff; | |
} | |
Fraction Fraction::operator++(int) { | |
Fraction ff(numerator, denominator); | |
Fraction f(1, 1); | |
numerator = numerator * f.denominator + f.numerator * denominator; | |
denominator = denominator * f.denominator; | |
simplify(); | |
return ff; | |
} | |
bool Fraction::operator>(const Fraction& f) { | |
int n = numerator * f.denominator - f.numerator * denominator; | |
int d = denominator * f.denominator; | |
Fraction ff(n, d); | |
return ff.numerator > 0; | |
} | |
bool Fraction::operator==(const Fraction& f) { | |
int n = numerator * f.denominator - f.numerator * denominator; | |
int d = denominator * f.denominator; | |
Fraction ff(n, d); | |
return ff.denominator == 0; | |
} | |
Fraction::operator double() { | |
return (double)numerator / denominator; | |
} | |
ostream &operator<<(ostream &output, const Fraction& f) { | |
output << "(" << f.numerator << "/" << f.denominator << ")"; | |
return output; | |
} | |
int main() | |
{ | |
Fraction f0(1, 2); | |
Fraction f1(1, 3); | |
cout << "f0: " << f0 << endl; | |
cout << "f1: " << f1 << endl; | |
cout << "f0 + f1: " << f0 + f1 << endl; | |
cout << "f0 - f1: " << f0 - f1 << endl; | |
cout << "f0 * f1: " << f0 * f1 << endl; | |
cout << "f0 / f1: " << f0 / f1 << endl; | |
f0 += f1; | |
cout << "after f0 += f1, f0: " << f0 << endl; | |
++f1; | |
cout << "after ++f1, f1: " << f1 << endl; | |
cout << "f0++, f0: " << f0++ << endl; | |
cout << "after f0++, f0: " << f0 << endl; | |
cout << "f0 > f1: " << (f0 > f1) << endl; | |
cout << "f0 == f1: " << (f0 == f1) << endl; | |
cout << "(double)f1: " << (double)f1 << endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment