Advertisement
JoelSjogren

Untitled

Jun 30th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <cassert>
  2. #include <algorithm>
  3. #include <ostream>
  4.  
  5. template <class T>
  6. class efrac {
  7.     T num, den;
  8.  
  9.     static T gcd_internal(T a, T b) {
  10.         return a == 0 ? b : gcd(b - b/a*a, a);
  11.     }
  12.    
  13. public:
  14.    
  15.     efrac (T pnum, T pden) {
  16.         assert(pnum >= 0 and pden >= 0);
  17.         T c = gcd(pnum, pden);
  18.         num = c ? pnum / c : 0;
  19.         den = c ? pden / c : 0;
  20.     }
  21.    
  22.     T get_num() { return num; }
  23.     T get_den() { return den; }
  24.    
  25.     static T gcd(T a, T b) {
  26.         assert(a >= 0 and b >= 0);
  27.         return a < b ? gcd_internal(a, b) : gcd_internal(b, a);
  28.     }
  29.    
  30.     static const efrac<T> null(0, 0);
  31.     static const efrac<T> zero(0, 1);
  32.     static const efrac<T> infty(1, 0);
  33.    
  34.     bool is_null()    const { return num == 0 and den == 0; }
  35.     bool is_zero()    const { return num == 0 and den != 0; }
  36.     bool is_infty()   const { return num != 0 and den == 0; }
  37.     bool is_regular() const { return num != 0 and den != 0; }
  38.    
  39.     efrac<T> inv() {
  40.         return efrac<T>(den, num);
  41.     }
  42.    
  43.     friend efrac<T>
  44.     operator+(const efrac<T>& a, const efrac<T>& b) {
  45.         if (a.is_null() or b.is_null()) return null;
  46.         if (a.is_infty() or b.is_infty()) return infty;
  47.         T c = gcd(a.den, b.den);
  48.         return efrac<T>(a.num*(b.den/c) + b.num*(a.den/c), a.den*(b.den/c));
  49.     }
  50.    
  51.     friend efrac<T>
  52.     operator*(const efrac<T>& a, const efrac<T>& b) {
  53.         T c = gcd(a.num, b.den);
  54.         T d = gcd(b.num, a.den);
  55.         if (c == 0 or d == 0) return null;
  56.         return efrac<T>((a.num/c)*(b.num/d), (a.den/d)*(b.den/c));
  57.     }
  58.    
  59.     friend std::ostream&
  60.     operator<<(std::ostream& os, const efrac<T>& a) {
  61.         return os << a.num << "/" << a.den;
  62.     }
  63.    
  64.     friend bool
  65.     operator==(const efrac<T>& a, const efrac<T>& b) {
  66.         return a.num == b.num and a.den == b.den;
  67.     }
  68.    
  69.     friend bool
  70.     operator!=(const efrac<T>& a, const efrac<T>& b) {
  71.         return not (a == b);
  72.     }
  73.    
  74.     friend efrac<T>
  75.     operator/(const efrac<T>& a, const efrac<T>& b) {
  76.         return a*b.inv();
  77.     }
  78.    
  79.     friend bool
  80.     operator<=(const efrac<T>& a, const efrac<T>& b) {
  81.         efrac c = a/b;
  82.         return c.num <= c.den;
  83.     }
  84.    
  85. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement