Найти египетские фракции в C#
Египетская фракция представляет собой долю, выраженную в виде суммы отдельных единичных дробей. Например, вы можете написать 3/7 как 1/3 + 1/11 + 1/231.
Вы можете написать любую фракцию как египетскую фракцию, и может быть несколько способов сделать это.
Один простой алгоритм для нахождения египетских фракций состоит в вычитании наибольшей частичной единицы, которая меньше исходного значения, а затем повторяется с результатом.
В этом примере используется класс Fraction, описанный в сообщении Сделайте класс фракции в C# . См. Этот пример для большинства деталей этого класса. Для обработки египетских фракций я добавил несколько операторов сравнения. Чтобы упростить сравнение фракций и целых чисел, я также добавил оператора для преобразования из long в Fraction. Следующий код показывает наиболее интересные новые фрагменты кода.
// Возвращает a & lt; б. public static bool operator <(Fraction a, Fraction b) { return (double)a < (double)b; } // Возвращаем & gt; б. public static bool operator >(Fraction a, Fraction b) { return (double)a > (double)b; }
Следующий код показывает, как программа использует пересмотренный класс Fraction для поиска египетских фракций.
// Возвращает строковое представление египетской фракции. private ListGetEgyptianFraction(Fraction frac) { List result = new List (); // Удалите часть целого числа. int whole_part = (int)(frac.Numerator / frac.Denominator); if (whole_part > 0) { result.Add(whole_part); frac = frac - whole_part; } // Вытаскиваем единичные фракции. long denom = 2; while (frac > 0) { // Делаем меньшую единицу фракции до тех пор, пока она не подходит. Fraction unit_fraction = new Fraction(1, denom); while (unit_fraction > frac) { denom++; unit_fraction = new Fraction(1, denom); } // Удаление единицы. result.Add(unit_fraction); frac -= unit_fraction; denom++; } return result; }
Сначала код удаляет из дроби всю целую часть. Например, он преобразует 12/5 в 2 + 2/5.