8

分数を単純化するためのライブラリまたは既存のコードを探しています。

手元にあるものやリンクを持っている人はいますか?

PS私はすでにプロセスを理解していますが、本当にホイールを書き直したくありません

アップデート

CodeProject で分数ライブラリをチェックアウトしましたが 、問題は分数を単純化するよりも少しトリッキーです。

20% / 50% / 30% (常に 100% に等しい)のパーセンテージ分割を減らす必要があります。

4

5 に答える 5

17

すべての数値の 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));
}

私はコードを試していませんが、正しいように単純に思えます (数値がすべて正の整数であり、空の配列を渡さないと仮定します)。

于 2010-05-31T03:30:58.560 に答える
5

無料のF#PowerPackライブラリにある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
于 2010-05-31T02:53:36.967 に答える
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に似ていますが、私が望むものはすべて少し異なっていました。

<3 c#


編集:ところで、メインクラスの場合は、静的に無効にすることを忘れないでください。

于 2010-05-31T02:53:55.373 に答える
2

このライブラリは、必要なもののように見えます:

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

ただし、私はそれをテストしていないので、動作させるにはいじる必要があるようです。

于 2010-05-31T02:10:16.967 に答える
2

私が見た Fraction (別名 Rational) の最も良い例は、Timothy Budd の "Classic Data Structures in C++" にあります。彼の実装は非常に優れています。これには、GCD アルゴリズムの単純な実装が含まれています。

C# に適応するのは難しくありません。

于 2010-05-31T02:10:26.913 に答える