C(n,m) ----------n是下标 , m是上标 (C上面m,下面n),C(n,m) 表示 n选m的组合数,等于从n开始连续递减的m个自然数的积除以从1开始连续递增的m个自然数的积。
从事绵阳服务器托管,服务器租用,云主机,网页空间,域名与空间,CDN,网络代维等服务。
例子:
C(8,3)=8*7*6/(1*2*3) =56
分子是从8开始连续递减的3个自然数的积
分母是从1开始连续递增的3个自然数的积
扩展资料
1、组合定义
组合(combination),数学的重要概念之一。从n个不同元素中每次取出m个不同元素(0≤m≤n),不管其顺序合成一组,称为从n个元素中不重复地选取m个元素的一个组合。
2、组合总数
组合总数(total number of combinations)是一个正整数,指从n个不同元素里每次取出0个,1个,2个,…,n个不同元素的所有组合数的总和。
3、重复组合
重复组合(combination with repetiton)是一种特殊的组合。从n个不同元素中可重复地选取m个元素。不管其顺序合成一组,称为从n个元素中取m个元素的可重复组合。当且仅当所取的元素相同,且同一元素所取的次数相同,则两个重复组合相同。
参考资料:百度百科-组合
实现的算法很多, 下面给出一个不需要递归的算法; 需要设计两个函数。
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));
}
只为了mn就要返回-1, 有点浪费啊~~~
注意求值范围, 如果需要可以int64扩展。。。
double fact(long num)
{
for (long i = 1; num 0; num--)
{
i *= num;
}
}
int main()
{
long m;
long n;
long C;
scanf("%ld %ld", m, n);
C = fact(n) / ((fact(m)) * fact(n-m));
printf("%ld",C);
return 0;
}
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款