works for n = 0..30 for all k
| 243 | |
| 244 | // works for n = 0..30 for all k |
| 245 | uint32_t combinations(uint16_t n, uint16_t k) |
| 246 | { |
| 247 | if ((k == 0) || (k == n)) return 1; |
| 248 | if (k < (n-k)) k = n - k; // symmetry |
| 249 | uint32_t rv = n; |
| 250 | uint8_t p = 2; |
| 251 | for (uint8_t i = n-1; i > k; i--) |
| 252 | { |
| 253 | // if ((0xFFFFFFFF / i) < rv) return 0; // overflow detect... |
| 254 | rv = (rv * i) / p; |
| 255 | p++; |
| 256 | } |
| 257 | return rv; |
| 258 | } |
| 259 | |
| 260 | |
| 261 | // works for n = 0..61 for all k |