How to simplify fractions in C#?

前端 未结 5 2361
暗喜
暗喜 2020-12-11 17:55

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 r

相关标签:
5条回答
  • 2020-12-11 18:16

    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.

    0 讨论(0)
  • 2020-12-11 18:30

    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#.

    0 讨论(0)
  • 2020-12-11 18:33

    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
    
    0 讨论(0)
  • 2020-12-11 18:39

    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).

    0 讨论(0)
  • 2020-12-11 18:40

    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.

    0 讨论(0)
提交回复
热议问题