分数を単純化するためのライブラリまたは既存のコードを探しています。
手元にあるものやリンクを持っている人はいますか?
PS私はすでにプロセスを理解していますが、本当にホイールを書き直したくありません
アップデート
CodeProject で分数ライブラリをチェックアウトしましたが 、問題は分数を単純化するよりも少しトリッキーです。
20% / 50% / 30% (常に 100% に等しい)のパーセンテージ分割を減らす必要があります。
分数を単純化するためのライブラリまたは既存のコードを探しています。
手元にあるものやリンクを持っている人はいますか?
PS私はすでにプロセスを理解していますが、本当にホイールを書き直したくありません
CodeProject で分数ライブラリをチェックアウトしましたが 、問題は分数を単純化するよりも少しトリッキーです。
20% / 50% / 30% (常に 100% に等しい)のパーセンテージ分割を減らす必要があります。
すべての数値の 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));
}
私はコードを試していませんが、正しいように単純に思えます (数値がすべて正の整数であり、空の配列を渡さないと仮定します)。
無料の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
カスタムソリューション:
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#
編集:ところで、メインクラスの場合は、静的に無効にすることを忘れないでください。
このライブラリは、必要なもののように見えます:
var f = new Fraction(numerator, denominator);
numerator = f.Numerator;
denominator = f.Denominator;
ただし、私はそれをテストしていないので、動作させるにはいじる必要があるようです。
私が見た Fraction (別名 Rational) の最も良い例は、Timothy Budd の "Classic Data Structures in C++" にあります。彼の実装は非常に優れています。これには、GCD アルゴリズムの単純な実装が含まれています。
C# に適応するのは難しくありません。