因子并不适用于所有价值观

时间:2013-03-02 20:00:18

标签: c++ function factorial

大家好我编辑了我的帖子,因为我的代码还有另一个问题。我昨天遇到了阶乘功能问题,但是由于你的回答我设法解决了,这是一个荒谬的错误。 现在的问题是,对于某些高于15的值,最终结果(不是单个数字的阶乘)总是0或-1,对于较小的值它可以正常工作。有人告诉我这个代码有什么问题:< / p>

    #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;
       }

2 个答案:

答案 0 :(得分:2)

整数溢出。

如果系统上int为32位,则它可以表示的最大值为2147483647。 13阶乘是6227020800

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

浮点数会给你更多的范围,但精度会下降。

如果你真的需要计算大因子,你需要使用一些像GMP这样的多精度库,或者使用一种内置任意精度整数运算的语言(C不是)

答案 1 :(得分:1)

以下可能会使用零或负参数调用factorial

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

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