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<k
。如果我们输入n=2, k=3
,程序就会出错。这是坏的!
我希望这可以帮助你。
【讨论】:
好,第二点没有在最高投票的答案中解释,+1。以上是关于C 程序计算从 n 个不同对象中选择 k 个对象的方法的数量。 'k' 和 'n' 都是整数的主要内容,如果未能解决你的问题,请参考以下文章