Добро пожаловать в мир чисел с конечной точностью!факт (40) равен 815915283247897734345611269596115894272000000000 или 0x8eeae81b84c7f27e080fde64ff05254000000000, который, очевидно, не поместится ни в uint64_t
, ни в 128 бит long long
, поскольку для него действительно требуется 160 бит!вычисляется с использованием uint64_t
при условии, что вы используете правильный алгоритм, к которому привыкли люди, прежде чем компьютеры появятся повсюду:
integer binomial_coefficient(integer n, integer r) {
integer bc = 1;
integer q = n - r;
for(integer i=1; i<=r; i++) {
br = br * (q + i) / i;
}
return bc;
}
Этот код даст вам правильное значение 137846528820 без переполнения.
(вышеуказанная функция пропускает тест для r <= n / 2, который может быть дополнительной оптимизацией, поскольку Cn, p по построению Cn, np) </p>