Сделать класс фракции в 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 преобразует дробь в двойную. Он объявлен неявным, поэтому вам не нужно использовать оператор трансляции для преобразования.
