Я пытаюсь вычислить комбинацию C (40, 20) в C++, однако типы данных в C++, похоже, не могут правильно обрабатывать этот расчет, даже если я использовал тип данных long long
. Ниже приведен мой код:Переполнение при вычислении комбинаций
#include <iostream>
long long fac(int x) {
register long long i,f = 1; // Optimize with regFunction
for(i = 1;i <= x;i++)
f *= i;
std::cout << f << std::endl;
return f;
}
// C(n,r) = n!/r!(n-r)!
long long C(long long n, long long r) {
return fac(n)/(fac(r) * fac(n - r));
}
int main(int argc, char const *argv[]) {
std::cout << C(40, 20) << std::endl;
return 0;
}
Любая идея для решения этой проблемы?
Ummm .... разве вы не имеете в виду 'C (40, 20)'? Напротив, это не имеет смысла. Как вы можете выбрать 40 образцов из группы из 20? – CoryKramer
40! >> LLONG_MAX –
1. Найдите способ выполнить вычисления с использованием меньших значений, ИЛИ 2. Найдите способ вычисления с меньшей точностью и используйте 'double', OR 3. используйте библиотеку bignum. – tenfour