Факториал не работает для всех ценностей

Привет всем, я отредактировал свое сообщение, потому что у меня есть другая проблема с моим кодом. У меня вчера была проблема с функцией факториала, но мне удалось решить ее благодаря вашим ответам, это была нелепая ошибка.
Теперь проблема в том, что для некоторых значений, превышающих 15, конечные результаты (не факториалы отдельных чисел) всегда равны 0 или -1, для меньших значений это работает нормально. Может кто-нибудь сказать мне, что не так с этим кодом:

    #include <iostream>
#include<time.h>

using namespace std;int factorial(int a){
if(a==1)
return 1;
else if(a==0)
return 1;
else
return factorial(a-1)*a;

}

int main(){
std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(5);
int n,k;
int x,y,z,w,v;cout<<"give n : ";
cin>>n;cout<<"give k : ";
cin>>k;

clock_t t;

t = clock();if(n>=k&&k>1){

x=factorial(n-1);
y=factorial(k-1);
z=factorial(n-1-k);
w=factorial(n-k);
v=factorial(k);cout<<"Result is "<<(x/(v*z))+(x/(y*w))<<endl;
}
else if (n==0||n==k)
cout<<"Result is  1"<<endl;
else
cout<<"Result is  0"<<endl;t = clock() - t;
cout<<"It took "<<t<<" clicks  ("<<((float)t)/CLOCKS_PER_SEC<<" seconds )"<<endl;return 0;
}

0

Решение

Целочисленное переполнение.

Если int 32 бита в вашей системе, наибольшее значение, которое он может представлять, 2147483647, 13 факториал 6227020800,

Если вы используете 64-битный целочисленный тип такой long longВы можете пойти до 20 факториала.

Плавающая точка даст вам больший диапазон, но с потерей точности.

Если вам действительно нужно вычислять большие факториалы, вам нужно использовать несколько библиотек с высокой точностью, таких как GMP, или используйте язык со встроенной целочисленной арифметикой произвольной точности (C не имеет).

2

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

Следующее может вызвать factorial с нулевым или отрицательным аргументом:

z=factorial(n-1-k);
w=factorial(n-k);

Вы должны убедиться, что ваш factorial Функция может обрабатывать такие аргументы без сбоев (я подозреваю, что нет).

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector