целое число — функция биномиального коэффициента C ++ неправильный ответ n & gt; 13

Я пытаюсь изучить 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;
}

-1

Решение

Если int в вашей системе 32 бита (очень распространено в настоящее время), тогда факториал 13 не вписывается в него (6227020800 > 2147483647).

Либо переход на что-то большее (unsigned long longКто-нибудь?), или используйте библиотеку bigint, или придумаете лучший / более умный алгоритм, который не включает вычисление больших факториалов, по крайней мере, напрямую.

1

Другие решения

int переменная может содержать только числа до определенного размера. Это варьируется от компилятора к компилятору и от платформы к платформе, но типичный лимит составляет около 2 миллиардов. Ваша программа использует числа больше этого, поэтому вы получаете ошибки.

Если вы хотите вычислять с большими целыми числами, ответ — получить большую целочисленную библиотеку. GMP популярный

2

Одним из предложений было бы использовать какой-то другой тип.

Вот список целочисленных типов, размеров и ограничений.

--------------------------------------------------------------------------------------
|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 обычно одинакового размера.

Заметка эти ограничения не одинаковы для всех архитектур. Стандарт гарантирует только две вещи с переменными размерами:

  1. 1 = sizeof(char) знак равно sizeof(unsigned char)
  2. 2 = sizeof(shor) знак равно sizeof(unsigned short) <знак равно sizeof(int) знак равно sizeof(unsigned int) <знак равно sizeof(long) знак равно sizeof(unsigned long) <знак равно sizeof(long long) знак равно sizeof(unsigned long long)

Другой вариант заключается в использовании BIGINT библиотека, однако в этом случае расчеты займут больше времени, но подойдут.

0