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

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

Есть у кого что под рукой или ссылки?

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

Обновлять

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

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


person Andrew Harry    schedule 31.05.2010    source источник
comment
Таким образом, процентное разделение может быть 2, 3 или больше.   -  person Andrew Harry    schedule 31.05.2010
comment
Будет ли каждый процент в разделении всегда быть целым числом от 0 до 100? Если да, то у меня есть ответ для вас.   -  person Cam    schedule 31.05.2010
comment
да, это будут целые числа 0-100   -  person Andrew Harry    schedule 31.05.2010
comment
Да, почти готово, подождите - минут 5-6 ;)   -  person Cam    schedule 31.05.2010


Ответы (5)


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

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));
}

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

person Gabe    schedule 31.05.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
person Matthew Flaschen    schedule 31.05.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);
}

Выходы:

2
3
5

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

<3 c#


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

person Cam    schedule 31.05.2010
comment
Добавление проверки простоты было неправильным. Представьте, что происходит, когда ваши данные {2, 98}. Кроме того, вместо того, чтобы пытаться делить на каждое целое число ‹= 50, вы должны просто использовать свой список простых чисел. Затем вы можете построить НОД и выполнить цикл деления только один раз. - person Gabe; 01.06.2010
comment
Кроме того, поскольку это была ваша первая программа на C#, вы могли не осознавать, что можно использовать cur % divideBy != 0 для проверки неделимости, а поскольку массив имеет только одно измерение, вы можете использовать numbers.Length для получения количества элементов. - person Gabe; 01.06.2010
comment
Не работает для таких случаев, как {3, 3, 3}, которые следует уменьшить до {1, 1, 1}. - person Andrew Harry; 27.06.2010

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

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

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

person MiffTheFox    schedule 31.05.2010

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

Адаптироваться к C# не составит труда.

person duffymo    schedule 31.05.2010