2014-10-11 3 views
4

Скажите, пожалуйста, как я могу применить перестановку и комбинацию в консольном приложении C# и принять значения N и r и вычислить перестановку и комбинацию.Перестановка и комбинация в C#

+0

Вам просто нужно число nCr и nPr? Вы еще что-нибудь пробовали? опубликуйте его и скажите, где вы застряли. – weston

ответ

11

Я просто сделал это для удовольствия, это на самом деле небольшой вызов, поскольку наивная реализация переполняет long очень быстро. Я включил их в комментарии.

Уравнения
nPr = n!/(n - r)! 
nCr = n!/r! (n - r)! 

Implementaion

public static class PermutationsAndCombinations 
{ 
    public static long nCr(int n, int r) 
    { 
     // naive: return Factorial(n)/(Factorial(r) * Factorial(n - r)); 
     return nPr(n, r)/Factorial(r); 
    } 

    public static long nPr(int n, int r) 
    { 
     // naive: return Factorial(n)/Factorial(n - r); 
     return FactorialDivision(n, n - r); 
    } 

    private static long FactorialDivision(int topFactorial, int divisorFactorial) 
    { 
     long result = 1; 
     for (int i = topFactorial; i > divisorFactorial; i--) 
      result *= i; 
     return result; 
    } 

    private static long Factorial(int i) 
    { 
     if (i <= 1) 
      return 1; 
     return i * Factorial(i - 1); 
    } 
} 

Использование

Console.WriteLine(PermutationsAndCombinations.nPr(10, 3)); 
Console.WriteLine(PermutationsAndCombinations.nCr(10, 3)); 

Печать:

720 
120 
+0

@ Рихард, нет, это не наивный, о котором я говорю, это будет «Factorial (n)/Factorial (n - r)», обновится, чтобы сделать яснее. – weston

+0

Получил! Извините, это тоже моя вина, английский не мой родной язык. – AFract

+0

// naive: return Factorial (n)/Factorial (r) * Factorial (n - r); должно быть // наивным: return Factorial (n)/(Factorial (r) * Factorial (n - r)); –

Смежные вопросы