//compiler options: /t:library using System; class Frac { int a, b; // razlomak je oblika a/b gde je b > 0 public int Num() { return a; } public int Den() { return b; } public Frac(int n) { a = n; b = 1; } public Frac(int p, int q) { if(q == 0) { throw new Exception("Imenilac razlomka je 0"); } if(q < 0) { p = -p; q = -q; } int d = GCD(Math.Abs(p), q); a = p / d; b = q / d; } static int GCD(int a, int b) { // znamo da je a >= 0 i b >= 0 if(a == 0) { return b; } if(b == 0) { return a; } int r; do { r = a % b; a = b; b = r; } while(r > 0); return a; } public static Frac Parse(string s) { string t = ""; foreach(char c in s) { if(!Char.IsWhiteSpace(c)) { t += c; } } if(String.IsNullOrEmpty(t)) { throw new Exception("Nije dobar zapis razlomka"); } int k = t.IndexOf('/'); if(k == -1) { return new Frac(int.Parse(t)); } return new Frac(int.Parse(t.Substring(0, k)), int.Parse(t.Substring(k+1))); } public override string ToString() { if(a == 0) { return "0"; } if(b == 1) { return a.ToString(); } return a.ToString() + "/" + b.ToString(); } public Frac Copy() { return new Frac(a, b); } public bool Equals(Frac r) { return a == r.a && b == r.b; } public int Compare(Frac r) { if(Equals(r)) { return 0; } if(a * r.b < r.a * b) { return -1; } return 1; } public static Frac operator + (Frac r, Frac s) { return new Frac(r.Num()*s.Den() + s.Num()*r.Den(), r.Den()*s.Den()); } public static Frac operator + (Frac r, int s) { return r + new Frac(s); } public static Frac operator + (int r, Frac s) { return new Frac(r) + s; } public static Frac operator - (Frac r, Frac s) { return new Frac(r.Num()*s.Den() - s.Num()*r.Den(), r.Den()*s.Den()); } public static Frac operator - (Frac r, int s) { return r - new Frac(s); } public static Frac operator - (int r, Frac s) { return new Frac(r) - s; } public static Frac operator - (Frac r) { return new Frac(-r.Num(), r.Den()); } public static Frac operator * (Frac r, Frac s) { return new Frac(r.Num()*s.Num(), r.Den()*s.Den()); } public static Frac operator * (Frac r, int s) { return r * new Frac(s); } public static Frac operator * (int r, Frac s) { return new Frac(r) * s; } public static Frac operator / (Frac r, Frac s) { return new Frac(r.Num()*s.Den(), r.Den()*s.Num()); } public static Frac operator / (Frac r, int s) { return r / new Frac(s); } public static Frac operator / (int r, Frac s) { return new Frac(r) / s; } public static implicit operator Frac(int n) { return new Frac(n); } }