/*

 * choose.c

 * This program reads a set size and a sub-set size, and returns the

 * number of different sub-sets that can be chosen from the set.

 */

 

#include <stdio.h>

 

/* Prototypes: */

int fact (int n);

int choose (int n, int k);

 

int main ()

{

  int   set_size;

  int   sub_set_size;

 

  /* Read the input. */

  printf ("Please enter the set size: ");

  scanf ("%d", &set_size);

 

  printf ("Please enter the sub-set size: ");

  scanf ("%d", &sub_set_size);

 

  /* Check the input. */

  if (set_size < 0 || sub_set_size < 0)

  {

    printf ("Illegal input!\n");

    return (1);

  }

 

  /* Compute the result. */

  printf ("There are %d possible sub-set(s) to choose.\n",

          choose (set_size, sub_set_size));

 

  return (0);

}

 

/* ------------------------------------------------------------------------

 * Function: fact

 * Purpose : Compute the factorial of a non-negative number.

 * Input   : n - A non-negative number.

 * Returns : The factorial of n (n!).

 */

int fact (int n)

{

  int   res = 1;

  int   i;

 

  for (i = 1; i <= n; i++)

    res *= i;

 

  return (res);

}

 

/* ------------------------------------------------------------------------

 * Function: choose

 * Purpose : Compute (n over k), which is the number of possible different

 *           sub-sets of size k one can choose from a set of size n.

 * Input   : n - The set size.

 *           k - The sub-set size.

 * Returns : (n over k).

 */

int choose (int n, int k)

{

  if (k > n)

    /* It is impossible to choose k > n out of n: */

    return (0);

 

  /*                                    n!

   * Use the formula:   n over k = -------------

   *                                k! * (n-k)!

   */

  return (fact(n) / (fact(k) * fact(n-k)));

}