| 
					
				 | 
			
			
				@@ -0,0 +1,120 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "Rational.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <iostream> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using namespace std; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational::Rational(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational::Rational(int num1, int num2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num = num1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum = num2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    simple(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational& Rational::operator += (const Rational& r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int scm = lcm(denum, r.denum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num = (num * (scm/denum) + r.num * (scm/r.denum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum = scm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational Rational :: operator + (const Rational& r) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Rational res(*this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return res += r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational& Rational::operator -= (const Rational& r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int scm = lcm(denum, r.denum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num = (num * (scm/denum) - r.num * (scm/r.denum)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum = scm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational Rational :: operator - (const Rational& r) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Rational res(*this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return res -= r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational& Rational::operator *= (const Rational& r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num *= r.num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum *= r.denum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    simple(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational Rational :: operator * (const Rational& r) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Rational res(*this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return res *= r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational& Rational::operator /= (const Rational& r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num *= r.denum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum *= r.num; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    simple(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return *this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational Rational :: operator / (const Rational& r) const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Rational res(*this); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return res /= r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ostream& operator <<(ostream& out, const Rational& r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return out << '(' << r.num << ")/(" << r.denum << ')'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational::operator double() const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return ((double)num/(double)denum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Rational::operator int() const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return int(double(*this)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int Rational::lcm(int num1, int num2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int result = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for(int dnum = 2; num1 != 1 or num2 != 1; dnum++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(num1%dnum==0 or num2%dnum==0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            num1%dnum==0 ? num1/=dnum : num1*1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            num2%dnum==0 ? num2/=dnum : num1*1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            result *= dnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int Rational::gcd(int num1, int num2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while (num1 && num2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (num1 >= num2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           num1 %= num2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           num2 %= num1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return num1 | num2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void Rational::simple() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int gct = gcd(num, denum); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num /= gct; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    denum /= gct;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |