阶乘并不是对所有值都有效

Factorial does not work for all values

本文关键字:有效 并不是 阶乘      更新时间:2023-10-16

大家好,我编辑了我的帖子,因为我的代码有另一个问题。昨天我有一个关于阶乘函数的问题,但多亏了你们的答案,我设法解决了它,这是一个荒谬的错误。现在的问题是,对于一些大于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;
       }

整数溢出

如果int在您的系统上是32位,那么它所能表示的最大值是2147483647。13的阶乘是6227020800

如果使用64位整数类型(如long long),则最多可以到20的阶乘。

浮点可以提供更大的范围,但会损失精度。

如果你真的需要计算大的阶乘,你需要使用一些多精度库,比如GMP,或者使用一种内置任意精度整数运算的语言(C没有)。

下面的代码可以使用0或负参数调用factorial:

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

您需要确保您的factorial函数可以处理这些参数而不会崩溃(我怀疑它不会)。