Я пытаюсь изучить C ++ и, следовательно, я пытаюсь сделать функцию для вычисления биномиального коэффициента. Код работает до n из 12, для больших значений сгенерированный результат неверен. Я благодарен за ваш вклад.
long double binomial(int n, int k) {
int d = n-k;
int i = 1, t = 1, n1 = 1, n2 = 1;
if (d == 0) {
return 1;
} else if (n==0) {
return 1;
} else {
while (i <=n) {
t *= i;
if (i == d) {
n1 = t;
cout << t;
}
if (i == k) {
n2 = t;
cout << t;
}
i++;
}
}
return t/n1/n2;
}
int main() {
int n, k;
cout << "Select an integer n: \n";
cin >> n;
cout << "Select an integer k: \n";
cin >> k;
long double v = binomial(n,k);
cout << "The binomial coefficient is: " << v << "\n";
return 0;
}
Если int
в вашей системе 32 бита (очень распространено в настоящее время), тогда факториал 13 не вписывается в него (6227020800 > 2147483647
).
Либо переход на что-то большее (unsigned long long
Кто-нибудь?), или используйте библиотеку bigint, или придумаете лучший / более умный алгоритм, который не включает вычисление больших факториалов, по крайней мере, напрямую.
int
переменная может содержать только числа до определенного размера. Это варьируется от компилятора к компилятору и от платформы к платформе, но типичный лимит составляет около 2 миллиардов. Ваша программа использует числа больше этого, поэтому вы получаете ошибки.
Если вы хотите вычислять с большими целыми числами, ответ — получить большую целочисленную библиотеку. GMP популярный
Одним из предложений было бы использовать какой-то другой тип.
Вот список целочисленных типов, размеров и ограничений.
--------------------------------------------------------------------------------------
|type |size (B)|Limits |
--------------------------------------------------------------------------------------
|long long |8 |–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807|
--------------------------------------------------------------------------------------
|unsigned long long |8 |0 to 18,446,744,073,709,551,615 |
--------------------------------------------------------------------------------------
|int |4 |–2,147,483,648 to 2,147,483,647 |
--------------------------------------------------------------------------------------
|unsigned int |4 |0 to 4,294,967,295 |
--------------------------------------------------------------------------------------
|short |2 |–32,768 to 32,767 |
--------------------------------------------------------------------------------------
|unsigned short |2 |0 to 65,535 |
--------------------------------------------------------------------------------------
|char |1 |–128 to 127 |
--------------------------------------------------------------------------------------
|unsigned char |1 |0 to 255 |
--------------------------------------------------------------------------------------
Заметка long
а также int
обычно одинакового размера.
Заметка эти ограничения не одинаковы для всех архитектур. Стандарт гарантирует только две вещи с переменными размерами:
sizeof(char)
знак равно sizeof(unsigned char)
sizeof(shor)
знак равно sizeof(unsigned short)
<знак равно sizeof(int)
знак равно sizeof(unsigned int)
<знак равно sizeof(long)
знак равно sizeof(unsigned long)
<знак равно sizeof(long long)
знак равно sizeof(unsigned long long)
Другой вариант заключается в использовании BIGINT библиотека, однако в этом случае расчеты займут больше времени, но подойдут.