#include "combinatoire.h" #include #include #include #include struct exception { char *nom; jmp_buf *contexte; }; struct exception les_exceptions[] = { {"<< débordement >>", NULL}, {"<< paramètre invalide >>", NULL} }; void cmb_associer_exception (cmb_exception c, jmp_buf * contexte) { les_exceptions[c].contexte = contexte; } static void verifier (int condition, cmb_exception c) { if (!condition) { if (les_exceptions[c].contexte != NULL) longjmp (*les_exceptions[c].contexte, 1); else { fprintf (stderr, "erreur %s non traitrée", les_exceptions[c].nom); exit (1); } } } unsigned long cmb_factorielle (unsigned long n) { unsigned long i; unsigned long f = 1; for (i = 2; i <= n; i++) { verifier (f < ULONG_MAX / n, debordement); f *= i; } return f; } unsigned long cmb_combinaison (unsigned long n, unsigned long p) /* n n-1 n-p+1 * = --- * ----- * ... * ------- * 1 2 p */ { unsigned long i; unsigned long c = n; verifier (n >= p, parametre_invalide); for (i = n - 1; i >= n - p + 1; i--) { verifier (c < ULONG_MAX / i, debordement); c = (i * c) / (n - i + 1); } return c; } unsigned long cmb_arrangement (unsigned long n, unsigned long p) /* n * n-1 * ... * n-p+1 */ { unsigned long i; unsigned long c = n; verifier (n >= p, parametre_invalide); for (i = n - 1; i >= n - p + 1; i--) { verifier (c < ULONG_MAX / i, debordement); c = i * c; } return c; } unsigned long cmb_catalan (unsigned long n) { return cmb_combinaison (2 * n - 2, n - 1) / n; }