Как упростить дроби в C #? - PullRequest
5 голосов
/ 31 мая 2010

Я ищу библиотеку или существующий код для упрощения дробей.

У кого-нибудь есть что-нибудь под рукой или какие-нибудь ссылки?

P.S. Я уже понимаю процесс , но на самом деле не хочу переписывать колесо

Обновление

Хорошо, я проверил библиотеку дробей в CodeProject НО проблема у меня немного сложнее, чем упрощение дроби.

Мне нужно уменьшить процентное разделение , которое может составить 20% / 50% / 30% (всегда равно 100%)

Ответы [ 5 ]

11 голосов
/ 31 мая 2010

Я думаю, вам просто нужно разделить на GCD все числа.

void Simplify(int[] numbers)
{
    int gcd = GCD(numbers);
    for (int i = 0; i < numbers.Length; i++)
        numbers[i] /= gcd;
}
int GCD(int a, int b)
{
    while (b > 0)
    {
        int rem = a % b;
        a = b;
        b = rem;
    }
    return a;
}
int GCD(int[] args)
{
    // using LINQ:
    return args.Aggregate((gcd, arg) => GCD(gcd, arg));
}

Я не пробовал код, но он кажется достаточно простым, чтобы быть правильным (при условии, что все ваши числа - положительные целые числа, и вы не пропускаете пустой массив).

3 голосов
/ 31 мая 2010

Вы можете использовать Microsoft.FSharp.Math.BigRational, который находится в бесплатной библиотеке F # Power Pack . Хотя это зависит от F # (это бесплатно и включено в VS2010), его можно использовать из C #.

BigRational reduced = BigRational.FromInt(4)/BigRational.FromInt(6);
Console.WriteLine(reduced);
    2/3
Console.WriteLine(reduced.Numerator);
    2
Console.WriteLine(reduced.Denominator);
    3
2 голосов
/ 31 мая 2010

Индивидуальное решение:

void simplify(int[] numbers)
{
    for (int divideBy = 50; divideBy > 0; divideBy--)
    {
        bool divisible = true;
        foreach (int cur in numbers)
        {   

            //check for divisibility
            if ((int)(cur/divideBy)*divideBy!=cur){
                divisible = false;
                break;
            }

        }
        if (divisible)
        {
            for (int i = 0; i < numbers.GetLength(0);i++ )
            {
                numbers[i] /= divideBy;
            }
        }
    }
}

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

int [] percentages = {20,30,50};
simplify(percentages);
foreach (int p in percentages)
{
    Console.WriteLine(p);
}

Outupts:

2
3
5

Кстати, это моя первая программа на c #. Подумал, что было бы просто забавно попробовать новый язык, и теперь я влюблен! Это как Java, но все, что я хотел, было немного по-другому, именно так, как я и хотел

<3 с # </p>


Редактировать: Кстати, не забудьте сделать его статическим недействительным, если это для вашего основного класса.

1 голос
/ 31 мая 2010

Лучший пример Fraction (он же Rational) я видел в «Классических структурах данных в C ++» Тимоти Бадда . Его реализация очень хорошая. Он включает в себя простую реализацию алгоритма GCD.

Это не должно быть трудно адаптироваться к C #.

1 голос
/ 31 мая 2010

Эта библиотека выглядит так, как будто вам нужно:

var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;

Хотя я не проверял его, так что, похоже, вам, возможно, придется поиграть с ним, чтобы заставить его работать.

...