-
-
Notifications
You must be signed in to change notification settings - Fork 50.4k
Expand file tree
/
Copy pathncr_combinations.py
More file actions
77 lines (62 loc) · 1.85 KB
/
ncr_combinations.py
File metadata and controls
77 lines (62 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"""
Generalized combinations (n choose r) calculator for real total and integer choose.
Wikipedia URL:
https://en.wikipedia.org/wiki/Binomial_coefficient
"""
from math import factorial as math_factorial
def combinations(total: float, choose: int) -> float:
"""
Compute the number of combinations using the formula:
combinations = total * (total-1) * ... * (total-choose+1) / choose!
Parameters
----------
total : float
Total number of items. Can be any real number.
choose : int
Number of items to select. Must be a non-negative integer.
Returns
-------
float
The number of combinations.
Raises
------
ValueError
If choose is not a non-negative integer.
Examples
--------
>>> combinations(5, 2)
10.0
>>> combinations(5.5, 2)
12.375
>>> combinations(10, 0)
1.0
>>> combinations(0, 0)
1.0
>>> combinations(5, -1)
Traceback (most recent call last):
...
ValueError: choose must be a non-negative integer
>>> combinations(5, 2.5)
Traceback (most recent call last):
...
ValueError: choose must be a non-negative integer
"""
if not isinstance(choose, int) or choose < 0:
raise ValueError("choose must be a non-negative integer")
if choose == 0:
return 1.0
numerator = 1.0
for i in range(choose):
numerator *= total - i
denominator = math_factorial(choose)
return numerator / denominator
if __name__ == "__main__":
import doctest
doctest.testmod()
# Example usage
total_input = float(input("Enter total (real number): ").strip() or 0)
choose_input = int(input("Enter choose (non-negative integer): ").strip() or 0)
print(
f"combinations({total_input}, {choose_input}) = "
f"{combinations(total_input, choose_input)}"
)