是否要計算階乘係數或二項式係數?
這聽起來像你想計算二項式係數 - 特別是當你提到11!/(7!3!)。
有可能是能爲你做這個圖書館,但作爲一個(大概)程序員訪問堆棧溢出沒有理由不自己寫一個。這不是太複雜。
爲避免內存溢出,請不要評估結果,直到刪除所有常見因素。
這個算法仍然需要改進,但是這裏有一個很好的算法的基礎。分母的值需要被分解爲它們的主要因素以獲得最佳結果。就目前而言,這很快就會運行n = 50。
float CalculateBinomial(int n, int k)
{
var numerator = new List<int>();
var denominator = new List<int>();
var denominatorOld = new List<int>();
// again ignore the k! common terms
for (int i = k + 1; i <= n; i++)
numerator.Add(i);
for (int i = 1; i <= (n - k); i++)
{
denominator.AddRange(SplitIntoPrimeFactors(i));
}
// remove all common factors
int remainder;
for (int i = 0; i < numerator.Count(); i++)
{
for (int j = 0; j < denominator.Count()
&& numerator[i] >= denominator[j]; j++)
{
if (denominator[j] > 1)
{
int result = Math.DivRem(numerator[i], denominator[j], out remainder);
if (remainder == 0)
{
numerator[i] = result;
denominator[j] = 1;
}
}
}
}
float denominatorResult = 1;
float numeratorResult = 1;
denominator.RemoveAll(x => x == 1);
numerator.RemoveAll(x => x == 1);
denominator.ForEach(d => denominatorResult = denominatorResult * d);
numerator.ForEach(num => numeratorResult = numeratorResult * num);
return numeratorResult/denominatorResult;
}
static List<int> Primes = new List<int>() { 2, 3, 5, 7, 11, 13, 17, 19,
23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };
List<int> SplitIntoPrimeFactors(int x)
{
var results = new List<int>();
int remainder = 0;
int i = 0;
while (!Primes.Contains(x) && x != 1)
{
int result = Math.DivRem(x, Primes[i], out remainder);
if (remainder == 0)
{
results.Add(Primes[i]);
x = result;
i = 0;
}
else
{
i++;
}
}
results.Add(x);
return results;
}
我可以估計N = 110,K = 50(返回6×10^31),但不能運行N = 120,K = 50。
工程就像一個魅力,感謝您的鏈接! – mmr 2009-09-30 18:41:41
又見[相同](http://numerics.mathdotnet.com/api/MathNet.Numerics/SpecialFunctions.htm#Factorial)在[Math.NET Numerics的](http://numerics.mathdotnet.com),則鏈接的Math.NET銥庫的後繼者。 – 2013-12-14 08:35:22