Nhìn vào mã của bạn, không có gì lạ khi bạn sẽ hết bộ nhớ khá nhanh. Phương thức của bạn divideFactorials
gọi phương thức giai thừa và sử dụng làm đối số sự khác biệt "tử số-mẫu số". Sự khác biệt đó rất có thể sẽ rất lớn theo mã của bạn và bạn sẽ bị mắc kẹt trong một vòng lặp rất dài trong phương pháp giai thừa của bạn.
Nếu nó thực sự chỉ là về việc tìm kiếm NCK (mà tôi giả sử vì bình luận của bạn trong mã của bạn), chỉ cần sử dụng:
public static long GetnCk(long n, long k)
{
long bufferNum = 1;
long bufferDenom = 1;
for(long i = n; i > Math.Abs(n-k); i--)
{
bufferNum *= i;
}
for(long i = k; i => 1; i--)
{
bufferDenom *= i;
}
return (long)(bufferNom/bufferDenom);
}
Tất nhiên sử dụng phương pháp này, bạn sẽ chạy ra khỏi phạm vi rất nhanh, bởi vì một dài không thực sự hỗ trợ số rất dài, vì vậy n và k phải nhỏ hơn 20.
Giả sử bạn thực sự làm việc với số lượng rất lớn bạn có thể sử dụng tăng gấp đôi thay vì thời gian dài, vì quyền hạn ngày càng trở nên quan trọng.
Edit: Nếu bạn sử dụng một số lượng lớn bạn cũng có thể sử dụng công thức Stirling của:
Như n trở ln lớn -> n * ln (n) - n (n!).
Đưa này vào mã:
public static double GetnCk(long n, long k)
{
double buffern = n*Math.Log(n) - n;
double bufferk = k*Math.Log(k) - k;
double bufferkn = Math.Abs(n-k)*Math.Log(Math.Abs(n-k)) - Math.Abs(n-k);
return Math.Exp(buffern)/(Math.Exp(bufferk)*Math.Exp(bufferkn));
}
tôi chỉ đề xuất câu trả lời này, như bạn nói ngôn ngữ độc lập, mã C# là chỉ được sử dụng để chứng minh điều đó. Vì bạn cần sử dụng số lớn cho n và k để làm việc này, tôi đề xuất đây là cách tổng quát để tìm hệ số nhị thức cho các kết hợp lớn.
Đối với các trường hợp là n và k nhỏ hơn khoảng 200-300, bạn nên sử dụng câu trả lời mà Victor Mukherjee đề xuất, vì nó chính xác.
Chỉnh sửa2: Đã chỉnh sửa mã đầu tiên của tôi.
Những con số này được gọi là "hệ số nhị thức" và như là một đối tượng rất phổ biến, đã xuất hiện trước đây trong SO: http://stackoverflow.com/q/4256188/422353 – madth3
Những loại kết hợp chính xác được bạn cố gắng để được? Nó chỉ đơn giản là nCk, hay nó là cái gì khác? Tôi chỉ hỏi vì bình luận của bạn ở đầu nói "nCk" nhưng mã của bạn không trực tiếp tính toán điều đó. – phil13131
Có, thêm dòng này vào giai thừa(): 'if (n> 20) ném OverflowException mới();' –