Cod sursa(job #1934150)

Utilizator valentin50517Vozian Valentin valentin50517 Data 21 martie 2017 10:53:37
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;


class frac{
	
private:
	long long a,b;
	long long gcd(long long a,long long b){
		if(!b) return a;
		return gcd(b,a%b);
	}
	
	frac red(frac fr){
		long long g = gcd(abs(fr.a),fr.b);
		fr.a/=g;
		fr.b/=g;
		return fr;
	}
	
	frac inv(frac fr){
		swap(fr.a,fr.b);
		if(fr.b < 0) fr.a*=-1,fr.b*=-1;
		return fr;
	}
	
public:
	
	frac(){
		a = 0;
		b = 1;
	}
	
	frac(long long a,long long b){
		this->a = a;
		this->b = b;
		*this = red(*this);
	}
	
	frac operator+(frac obj){
		long long ra,rb;
		rb = b*obj.b/gcd(b,obj.b);
		ra = a * (rb/b) + obj.a * (rb/obj.b);
		return red(frac(ra,rb));
	}
		
	frac operator-(frac obj){
		long long ra,rb;
		rb = b*obj.b/gcd(b,obj.b);
		ra = a * (rb/b) - obj.a * (rb/obj.b);
		return red(frac(ra,rb));
	}
	
	frac operator*(frac obj){
		return red(frac(a*obj.a,b*obj.b));
	}
	
	frac operator/(frac obj){
		obj = inv(obj);
		return red(frac(a*obj.a,b*obj.b));
	}
	
	frac operator*=(frac obj){
		*this = *this * obj; 
	}
	
	frac operator/=(frac obj){
		*this = *this / obj; 
	}
	
	frac operator+=(frac obj){
		*this = *this + obj; 
	}
	
	frac operator-=(frac obj){
		*this = *this + obj; 
	}
	
	string toStr(){
		return to_string(a) + (b != 1 ? "/" + to_string(b) : "");
	}
	
	friend ostream& operator<< (ostream& stream,frac obj){
		stream << obj.toStr();
		return stream;
	}
	
	
};

int main(){
	frac a(2,5),b(6,4);
	cout << a << ' ' << b << '\n';
	cout << (a+b);
}