Как упростить дроби? - PullRequest
       20

Как упростить дроби?

5 голосов
/ 13 марта 2011

Как упростить дробь в C #? Например, учитывая 1 11/6, мне нужно, чтобы оно было упрощено до 2 5/6.

Ответы [ 4 ]

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

Если все, что вам нужно, это превратить вашу дробь в смешанное число, дробная часть которого является правильной дробью, как предполагалось в предыдущих ответах, вам нужно только добавить numerator / denominator ко всей части числа и установить числитель на numerator % denominator. Использование циклов для этого совершенно не нужно.

Однако термин «упрощение» обычно относится к сокращению дроби до ее самых низких значений. Ваш пример не дает четкого представления о том, хотите ли вы этого, поскольку в любом случае этот пример имеет самые низкие значения.

Вот класс C #, который нормализует смешанное число, так что каждое число имеет ровно одно представление: дробная часть всегда правильная и всегда в своих нижних терминах, знаменатель всегда положительный, а знак всей части всегда такой же, как знак числителя.

using System;

public class MixedNumber {
    public MixedNumber(int wholePart, int num, int denom)
    {  
        WholePart = wholePart;
        Numerator = num;
        Denominator = denom;
        Normalize();
    }

    public int WholePart { get; private set; }
    public int Numerator { get; private set; }
    public int Denominator { get; private set; }

    private int GCD(int a, int b)
    {  
        while(b != 0)
        {  
            int t = b;
            b = a % b;
            a = t;
        }
        return a;
    }

    private void Reduce(int x) {
        Numerator /= x;
        Denominator /= x;
    }

    private void Normalize() {
        // Add the whole part to the fraction so that we don't have to check its sign later
        Numerator += WholePart * Denominator;

        // Reduce the fraction to be in lowest terms
        Reduce(GCD(Numerator, Denominator));

        // Make it so that the denominator is always positive
        Reduce(Math.Sign(Denominator));

        // Turn num/denom into a proper fraction and add to wholePart appropriately
        WholePart = Numerator / Denominator;
        Numerator %= Denominator;
    }

    override public String ToString() {
        return String.Format("{0} {1}/{2}", WholePart, Numerator, Denominator);
    }
}

Пример использования:

csharp> new MixedNumber(1,11,6);     
2 5/6
csharp> new MixedNumber(1,10,6);   
2 2/3
csharp> new MixedNumber(-2,10,6);  
0 -1/3
csharp> new MixedNumber(-1,-10,6); 
-2 -2/3
3 голосов
/ 13 марта 2011
int unit = 1;
int numerator = 11;
int denominator = 6;

while(numerator >= denominator)
{
    numerator -= denominator;
    if(unit < 0)
        unit--;
    else
        unit++;
}

Тогда делай с переменными все, что хочешь.

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

1 голос
/ 13 марта 2011
int num = 11;
int denom = 6;
int unit = 1;
while (num >= denom)
{
  num -= denom;
  unit++;
}

Извините, я не полностью понял ту часть о отслеживании значений единиц.

0 голосов
/ 08 ноября 2013

, чтобы упростить дробь 6/11, вы бы увидели, могли бы вы выстроить и то и другое на одно число больше 1 и разделить.

Итак

  • 2,4,6,8,10,12 нет
  • 1,3,6,9,12 нет
  • 4,8 нет
  • 5,10 нет
  • 6,12 нет
  • 7 нет
  • 8 нет
  • 9 нет.

Нет будет ответом для всех, так что это уже в самом простом. Больше ничего не поделаешь.

...