Как вы можете добавить две фракции? - PullRequest
3 голосов
/ 19 марта 2011

Как вы можете добавить две дроби в c # следующим образом:

11/6 + 3/4 = 31/12

, а затем как бы вы упростили ответ?

Ответы [ 4 ]

7 голосов
/ 19 марта 2011

Когда в пятницу вечером наступает скука ... в результате получается класс Fraction с перегруженными операторами. Трезвость дизайна не может быть гарантирована.

Это работает так ...

Fraction left = "1/2";
Fraction right = "3/8";

Fraction result1 = ((left + right) * left / right).Simplify();
Console.WriteLine(result1);

Fraction test2 = "12/32";
test2 = test2.Simplify();
Console.WriteLine(test2);

Реализация примерно такая, как ниже ...

public struct Fraction
{
    public int Numerator { get; set; }
    public int Denominator { get; set; }

    public Fraction(int numerator, int denominator)
        : this()
    {
        Numerator = numerator;
        Denominator = denominator;
    }

    public Fraction Simplify()
    {
        int gcd = GCD();
        return new Fraction(Numerator / gcd, Denominator / gcd);
    }

    public Fraction InTermsOf(Fraction other)
    {
        return Denominator == other.Denominator ? this :
            new Fraction(Numerator * other.Denominator, Denominator * other.Denominator);
    }

    public int GCD()
    {
        int a = Numerator;
        int b = Denominator;
        while (b != 0)
        {
            int t = b;
            b = a % b;
            a = t;
        }
        return a;
    }

    public Fraction Reciprocal()
    {
        return new Fraction(Denominator, Numerator);
    }


    public static Fraction operator +(Fraction left, Fraction right)
    {
        var left2 = left.InTermsOf(right);
        var right2 = right.InTermsOf(left);

        return new Fraction(left2.Numerator + right2.Numerator, left2.Denominator);
    }

    public static Fraction operator -(Fraction left, Fraction right)
    {
        var left2 = left.InTermsOf(right);
        var right2 = right.InTermsOf(left);

        return new Fraction(left2.Numerator - right2.Numerator, left2.Denominator);
    }

    public static Fraction operator *(Fraction left, Fraction right)
    {
        return new Fraction(left.Numerator * right.Numerator, left.Denominator * right.Denominator);
    }

    public static Fraction operator /(Fraction left, Fraction right)
    {
        return new Fraction(left.Numerator * right.Denominator, left.Denominator * right.Numerator);
    }

    public static implicit operator Fraction(string value)
    {
        var tokens = value.Split('/');
        int num;
        int den;
        if (tokens.Length == 1 && int.TryParse(tokens[0], out num))
        {
            return new Fraction(num, 1);
        }
        else if (tokens.Length == 2 && int.TryParse(tokens[0], out num) && int.TryParse(tokens[1], out den))
        {
            return new Fraction(num, den);
        }
        throw new Exception("Invalid fraction format");
    }

    public override string ToString()
    {
        return string.Format("{0}/{1}", Numerator, Denominator);
    }
}
3 голосов
/ 19 марта 2011

.Net не имеет встроенной поддержки (о которой я знаю) для Rational Numbers , но существует хотя бы одна существующая библиотека.

Ваше решение в конечном итоге сводится к хранению числителя и знаменателя (возможно, в пользовательском классе, который вы создаете), выполнению арифметики с другими парами числитель / знаменатель (возможно, с помощью реализации перегруженных операторов в вашем классе) и применение алгоритма упрощения дроби.

Вот некоторые ресурсы:

Существующие реализации

Методы восстановления фракций

2 голосов
/ 19 марта 2011

Сначала найдите ЖК-дисплей, затем выполните следующие действия:

  num1 *= lcd / denum1;
  num2 *= lcd / denum2;
  sumNum = num1 + num2;
0 голосов
/ 19 марта 2011

Я никогда не использовал c #, но могу объяснить, как это сделать.

  1. проверить, совпадают ли нижние числа (равны)
  2. Если нет, то создайте цикл, который будет перебирать все числа и умножать их на нижние числа. Например, просто скажем, что вы начали с 1, а затем умножаете 1 на 6, а затем 1 на 4, если результат совпадает с полученным вами правильным числом.
  3. чем вы набрали номер # 2 и умножьте его на верхние числа
  4. , чем просто добавить верхние цифры
  5. оставить нижний номер таким же
  6. создать цикл, чтобы увидеть, какое число можно разделить на оба числа (сверху и снизу)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...