【问题标题】:C program to calculates the number of ways to choose k objects from n distinct objects. 'k' and 'n' both are integersC 程序计算从 n 个不同对象中选择 k 个对象的方法的数量。 'k' 和 'n' 都是整数
【发布时间】:2015-10-19 01:29:18
【问题描述】:

我编写了一个 C 程序来计算使用函数从 n 个不同对象中选择 k 个对象的方法的数量。

    #include<stdio.h>
    long f(int a)
    {
     if(a==1||a==0)return(0);
     else return(a*f(a-1));
    }

    int combination(int N,int K)
    {
     long int NF,KF,NMKF;
     NF=f(N);
     KF=f(K);
     NMKF=f(N-K);
     return(NF/(KF*NMKF));

    }
    int main()
    {
     int n,k;
     scanf("%d%d",&n,&k);
     combination(n,k);
    }

但是编译器显示以下错误信息

floating point exception (core dumped)

如何避免?

【问题讨论】:

  • 从阶乘计算二项式系数是一个非常糟糕的主意。
  • 这个错误看起来像一个算术错误(除以零,以零取模,等等......)
  • 您可以自己发现这一点。您应该学习如何使用调试器。
  • 编译器无法显示异常。 (除非在最奇怪的情况下编译器自行崩溃)

标签: c algorithm function combinations coredump


【解决方案1】:

问题出在这一行

if(a==1||a==0)return(0);

应该是

if(a==1||a==0)return(1);

在计算阶乘时,n*(n-1)*(n-2)...*(2)*(1)。注意最后,我们乘以1 而不是零。与0 相乘将得到阶乘0。稍后当您执行除法时,0 出现在分母中,floating point exception 正在发生。这就是你的程序出错的原因。

对于需要 0 阶乘的情况。然后这也会起作用,因为 0 的阶乘是 1 并且 not 0.. 检查 this

【讨论】:

    【解决方案2】:

    两个问题:

    1. if(a==1||a==0) 你应该return 1,而不是return 0。因为1!=1, 0!=1
    2. 您的意图是choose k objects from n distinct objects。但是您应该添加参数检查,以免出现n&lt;k。如果我们输入n=2, k=3,程序就会出错。这是坏的! 我希望这可以帮助你。

    【讨论】:

    • 好,第二点没有在最高投票的答案中解释,+1。
    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 2013-02-24
    • 2013-11-08
    • 1970-01-01
    • 2020-05-05
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多