Сделать класс фракции в C#
Класс Fraction представляет рациональные числа с использованием дробей, по крайней мере, до тех пор, пока числители и демониторы не станут слишком большими. Класс Fraction использует следующий код, большинство из которых просты.
class Fraction { public long Numerator, Denominator; public Fraction(string txt) { string[] pieces = txt.Split('/'); Numerator = long.Parse(pieces[0]); Denominator = long.Parse(pieces[1]); Simplify(); } public Fraction(long numer, long denom) { Numerator = numer; Denominator = denom; Simplify(); } public static Fraction operator *(Fraction a, Fraction b) { Fraction result1 = new Fraction(a.Numerator, b.Denominator); Fraction result2 = new Fraction(b.Numerator, a.Denominator); return new Fraction( result1.Numerator * result2.Numerator, result1.Denominator * result2.Denominator); } public static Fraction operator -(Fraction a) { return new Fraction(-a.Numerator, a.Denominator); } public static Fraction operator +(Fraction a, Fraction b) { long gcd_ab = MathStuff.GCD(a.Denominator, b.Denominator); long numer = a.Numerator * (b.Denominator / gcd_ab) + b.Numerator * (a.Denominator / gcd_ab); long denom = a.Denominator * (b.Denominator / gcd_ab); return new Fraction(numer, denom); } public static Fraction operator -(Fraction a, Fraction b) { return a + -b; } public static Fraction operator /(Fraction a, Fraction b) { return a * new Fraction(b.Denominator, b.Numerator); } private void Simplify() { if (Denominator < 0) { Numerator = -Numerator; Denominator = -Denominator; } long gcd_ab = MathStuff.GCD(Numerator, Denominator); Numerator = Numerator / gcd_ab; Denominator = Denominator / gcd_ab; } public static implicit operator double(Fraction a) { return (double)a.Numerator / a.Denominator; } public override string ToString() { return Numerator.ToString() + "/" + Denominator.ToString(); } }
Метод Simplify делит наибольший общий делитель (GCD) с числителем и знаменателем. Описание функции GCD см. В примере Вычислите наибольший общий делитель (GCD) и наименьшее общее число (LCM) двух целых чисел в C# .
Класс Fraction является таким же упражнением при перегрузке оператора, как и все остальное. Оператор double преобразует дробь в двойную. Он объявлен неявным, поэтому вам не нужно использовать оператор трансляции для преобразования.