【问题标题】:Factorial does not work for all values阶乘不适用于所有值
【发布时间】:2013-03-02 20:00:17
【问题描述】:

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

【问题讨论】:

  • 您需要向我们展示factorial 的代码。
  • 只是一个问题! - 确保在除法时不会遇到被零除错误,即 v * zy * w 的值应为非零。发布 factorial 函数可以让我们更深入地了解问题所在。
  • 嗯,你没有说它在哪里崩溃。当它崩溃时,使用调试器查看发生了什么。

标签: c++ function factorial


【解决方案1】:

整数溢出。

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

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

浮点会给你更大的范围,但会损失精度。

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

【讨论】:

  • 感谢您的回答,我将自己研究更多内容,看看是否会更改代码上的任何内容。因为它在技术上是正确的,但我认为我不会因为不被处罚而受到惩罚能够计算所有值
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢大家,我刚刚意识到我忘记在阶乘函数中计算零阶乘。我什至不关心查看函数,因为我从一个旧练习中复制粘贴,直到现在正确
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多