choose.cpp 853 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // For example, the number of five card hands is choose(52,5)
  2. //
  3. // n!
  4. // choose(n,k) = -------------
  5. // k! (n - k)!
  6. #include "stdafx.h"
  7. #include "defs.h"
  8. void
  9. eval_choose(void)
  10. {
  11. push(cadr(p1));
  12. eval();
  13. push(caddr(p1));
  14. eval();
  15. choose();
  16. }
  17. // Result vanishes for k < 0 or k > n. (A=B, p. 19)
  18. #define N p1
  19. #define K p2
  20. void
  21. choose(void)
  22. {
  23. save();
  24. K = pop();
  25. N = pop();
  26. if (choose_check_args() == 0) {
  27. push_integer(0);
  28. restore();
  29. return;
  30. }
  31. push(N);
  32. factorial();
  33. push(K);
  34. factorial();
  35. divide();
  36. push(N);
  37. push(K);
  38. subtract();
  39. factorial();
  40. divide();
  41. restore();
  42. }
  43. int
  44. choose_check_args(void)
  45. {
  46. if (isnum(N) && lessp(N, zero))
  47. return 0;
  48. else if (isnum(K) && lessp(K, zero))
  49. return 0;
  50. else if (isnum(N) && isnum(K) && lessp(N, K))
  51. return 0;
  52. else
  53. return 1;
  54. }