Skip to content

Instantly share code, notes, and snippets.

@pwxcoo
Last active April 21, 2026 20:11
Show Gist options
  • Select an option

  • Save pwxcoo/bff885923b32ec5d3a1d16286f9efd89 to your computer and use it in GitHub Desktop.

Select an option

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;
}
@RyukNet

RyukNet commented Apr 21, 2026

Copy link
Copy Markdown

Mark functions operator>, operator== and operator double() as const for usability in case of declaring const Fraction foo and still works for non const variable

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment