How to simplify fractions in C#?

▼魔方 西西 提交于 2019-11-27 19:29:51

问题


I'm looking for a library or existing code to simplify fractions.

Does anyone have anything at hand or any links?

P.S. I already understand the process but really don't want to rewrite the wheel

Update

Ok i've checked out the fraction library on the CodeProject BUT the problem I have is a little bit tricker than simplifying a fraction.

I have to reduce a percentage split which could be 20% / 50% / 30% (always equal to 100%)


回答1:


I think you just need to divide by the GCD of all the numbers.

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

I haven't tried the code, but it seems simple enough to be right (assuming your numbers are all positive integers and you don't pass an empty array).




回答2:


You can use Microsoft.FSharp.Math.BigRational, which is in the free F# Power Pack library. Although it depends on F# (which is gratis and included in VS2010), it can be used from C#.

BigRational reduced = BigRational.FromInt(4)/BigRational.FromInt(6);
Console.WriteLine(reduced);
    2/3
Console.WriteLine(reduced.Numerator);
    2
Console.WriteLine(reduced.Denominator);
    3



回答3:


A custom solution:

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

Example usage:

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

Outupts:

2
3
5

By the way, this is my first c# program. Thought it would simply be a fun problem to try a new language with, and now I'm in love! It's like Java, but everything I wish was a bit different is exactly how I wanted it

<3 c#


Edit: Btw don't forget to make it static void if it's for your Main class.




回答4:


This library looks like it might be what you need:

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

Although, I haven't tested it, so it looks like you may need to play around with it to get it to work.




回答5:


The best example of Fraction (aka Rational) I've seen is in Timothy Budd's "Classic Data Structures in C++". His implementation is very good. It includes a simple implementation of GCD algorithm.

It shouldn't be hard to adapt to C#.



来源:https://stackoverflow.com/questions/2941048/how-to-simplify-fractions-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!