从n个不同的对象中选择k个对象的方式数计算的C程序。'k'和'n'都是整数。

4
我写了一个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)

如何避免呢?

1
计算二项式系数时从阶乘中推导是一个非常糟糕的想法。 - EOF
1
错误看起来像是一个算术错误(除以零,模零等...) - Senua
1
你本来可以自己找出这个问题的。你应该学会如何使用调试器。 - Jabberwocky
编译器无法显示异常。(除非在最奇怪的情况下,编译器自己崩溃了) - Peter Miehle
2个回答

12

问题出在这一行

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位于分母中,导致浮点异常。这就是为什么程序出错的原因。

对于需要求0的阶乘的情况,这也适用,因为0的阶乘是1,而不是0。查看此视频了解更多。


3

有两个问题:

  1. if(a==1||a==0) 你应该 return 1,而不是 return 0。因为 1!=1, 0!=1
  2. 你的意图是从n个不同的对象中选择k个对象。但是你应该添加参数检查以避免出现 n<k 的情况。如果我们输入 n=2, k=3,程序将会出错。这是不好的!我希望这可以帮助你。

好的,最受赞同的回答没有解释第二点,+1。 - Am_I_Helpful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接