Skip to content

Instantly share code, notes, and snippets.

@pwxcoo
Last active February 14, 2023 00:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save pwxcoo/bff885923b32ec5d3a1d16286f9efd89 to your computer and use it in GitHub Desktop.
Save pwxcoo/bff885923b32ec5d3a1d16286f9efd89 to your computer and use it in GitHub Desktop.
Fraction implement by C++
#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