22#define INFIZ_RATIONAL_NUMBER_H
33
44// RationalNumber.h
5+ #include < numeric>
56
67/* *
78 * A Class that stores the numerator and denominator
@@ -15,40 +16,46 @@ class RationalNumber
1516 : numerator(num), denominator(den)
1617 {}
1718
18- constexpr auto operator /( const RationalNumber &rhs ) const noexcept -> RationalNumber
19+ [[nodiscard]] constexpr auto simplify ( ) const noexcept -> RationalNumber
1920 {
20- return { numerator * rhs.getDenominator (), denominator * rhs.getNumerator () };
21+ const auto gcd = std::gcd (numerator, denominator);
22+ return {numerator / gcd, denominator / gcd};
2123 }
2224
23- constexpr auto operator * (const RationalNumber &rhs) const noexcept -> RationalNumber
25+ [[nodiscard]] constexpr auto operator / (const RationalNumber &rhs) const noexcept -> RationalNumber
2426 {
25- return { numerator * rhs.getNumerator (), denominator * rhs.getDenominator () };
27+ return RationalNumber { numerator * rhs.getDenominator (), denominator * rhs.getNumerator () }. simplify () ;
2628 }
2729
28- constexpr auto operator + (const RationalNumber &rhs) const noexcept -> RationalNumber
30+ [[nodiscard]] constexpr auto operator * (const RationalNumber &rhs) const noexcept -> RationalNumber
2931 {
30- return { numerator * rhs.getDenominator () + (rhs.getNumerator () * denominator),
31- denominator * rhs.getDenominator () };
32+ return RationalNumber{ numerator * rhs.getNumerator (), denominator * rhs.getDenominator () }.simplify ();
3233 }
3334
34- constexpr auto operator - (const RationalNumber &rhs) const noexcept -> RationalNumber
35+ [[nodiscard]] constexpr auto operator + (const RationalNumber &rhs) const noexcept -> RationalNumber
3536 {
36- return { numerator * rhs.getDenominator () - (rhs.getNumerator () * denominator),
37- denominator * rhs.getDenominator () };
37+ return RationalNumber { numerator * rhs.getDenominator () + (rhs.getNumerator () * denominator),
38+ denominator * rhs.getDenominator () }. simplify () ;
3839 }
3940
40- constexpr auto getDenominator () const noexcept -> int { return denominator; }
41+ [[nodiscard]] constexpr auto operator -(const RationalNumber &rhs) const noexcept -> RationalNumber
42+ {
43+ return RationalNumber{ numerator * rhs.getDenominator () - (rhs.getNumerator () * denominator),
44+ denominator * rhs.getDenominator () }.simplify ();
45+ }
46+
47+ [[nodiscard]] constexpr auto getDenominator () const noexcept -> int { return denominator; }
4148
42- constexpr auto operator -() const -> RationalNumber { return { numerator * -1 , denominator }; }
49+ [[nodiscard]] constexpr auto operator -() const -> RationalNumber { return { numerator * -1 , denominator }; }
4350
44- constexpr auto getNumerator () const noexcept -> int { return numerator; }
51+ [[nodiscard]] constexpr auto getNumerator () const noexcept -> int { return numerator; }
4552
46- constexpr auto getFloat () const noexcept -> float
53+ [[nodiscard]] constexpr auto getFloat () const noexcept -> float
4754 {
4855 return ((static_cast <float >(numerator)) / (static_cast <float >(denominator)));
4956 }
5057
51- constexpr auto operator ==(const RationalNumber &rhs) const noexcept -> bool {
58+ [[nodiscard]] constexpr auto operator ==(const RationalNumber &rhs) const noexcept -> bool {
5259 return numerator == rhs.numerator && denominator == rhs.denominator ;
5360 }
5461
0 commit comments