如何简化C#中的分数?

时间:2010-05-31 02:05:50

标签: c# math fractions

我正在寻找一个库或现有代码来简化分数。

有没有人手边有任何东西或任何链接?

P.S。我已经understand the process但是真的不想重写轮子

更新

好的我已经查看了fraction library on the CodeProject 但是我所遇到的问题比简化一个小部分有点琐碎。

我必须减少百分比,这可能是20%/ 50%/ 30%(总是等于100%)

5 个答案:

答案 0 :(得分:11)

我认为你只需要将所有数字除以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));
}

我没有尝试过代码,但看起来很简单(假设你的数字都是正整数而你没有传递一个空数组)。

答案 1 :(得分:3)

您可以使用免费F# Power Pack库中的Microsoft.FSharp.Math.BigRational。虽然它取决于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 :(得分:2)

自定义解决方案:

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,但我希望的一切都与我想要的有点不同

&lt; 3 c#


编辑:顺便说一句,如果是你的Main类,请不要忘记将其设为静态无效。

答案 3 :(得分:1)

This library看起来可能就是您所需要的:

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

虽然,我还没有对它进行测试,所以看起来你可能需要玩它才能让它发挥作用。

答案 4 :(得分:1)

我见过的Fraction(aka Rational)的最佳例子是Timothy Budd's "Classic Data Structures in C++"。他的实施非常好。它包括一个简单的GCD算法实现。

应该很难适应C#。