用C语言求组合数
发布网友
发布时间:2022-05-10 07:41
我来回答
共2个回答
热心网友
时间:2023-11-22 13:50
实现的算法很多, 下面给出一个不需要递归的算法; 需要设计两个函数。
unsigned long factorial (unsigned long n);
long long perm(unsigned long m, unsigned long n);
unsigned long factorial (unsigned long n)
{
unsigned long value = (n == 0) ? 1 : n;
while( n >= 2 )
value *= --n;
return value;
}
long long perm(unsigned long m, unsigned long n)
{
if (m > n)
return -1;
else
return (unsigned long) (factorial(n)/factorial(n-m));
}
只为了m>n就要返回-1, 有点浪费啊~~~
注意求值范围, 如果需要可以int64扩展。。。追问unsigned long value = (n == 0) ? 1 : n;
这是什么意思,那个?还有1:n看得我云里雾里
还有--n是什么意思
(factorial(n)/factorial(n-m)这不是组合数啊,还要除一个factorial(m)吧
追答① (n == 0) ? 1 : n; 这个是3目运算, 就是如果条件真就是1;否则是n;
② --n就是 n-1然后把结果赋值给=左边。
③ 嗯, 上面的例子,的确计算的是排列permutation, 而非组合combination, 如果要算combination, 再除一个factorial(m)。
修改perm函数为comb
long long comb(unsigned long m, unsigned long n)
{
if (m > n)
return -1;
else
return (unsigned long) (factorial(n) / (factorial(n-m)*factorial(m)));
}
热心网友
时间:2023-11-22 13:51
楼下正解