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

Posted

技术标签:

【中文标题】C 程序计算从 n 个不同对象中选择 k 个对象的方法的数量。 \'k\' 和 \'n\' 都是整数【英文标题】: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)

如何避免?

【问题讨论】:

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

两个问题:

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

【讨论】:

好,第二点没有在最高投票的答案中解释,+1。

以上是关于C 程序计算从 n 个不同对象中选择 k 个对象的方法的数量。 'k' 和 'n' 都是整数的主要内容,如果未能解决你的问题,请参考以下文章

python k-means聚类

数据建模()-K-means聚类算法

对象指针向量的元素 K 在将第 N 个元素从元素 K-1 推入向量后变为空

从 C 中的 n 生成 k 个排列

模式识别与机器学习——4.3离散K-L变换

9-n个人中选k个人的选择方法种类