C语言编程实现求组合数P=C(n,k)的值
double
十余年的松阳网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整松阳建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“松阳网站设计”,“松阳网站推广”以来,每个客户项目都认真落实执行。
lnchoose(int
n,
int
m)
{
if
(m
n)
{
return
0;
}
if
(m
n/2.0)
{
m
=
n-m;
}
double
s1
=
0;
for
(int
i=m+1;
i=n;
i++)
{
s1
+=
log((double)i);
}
double
s2
=
0;
int
ub
=
n-m;
for
(int
i=2;
i=ub;
i++)
{
s2
+=
log((double)i);
}
return
s1-s2;
}
double
choose(int
n,
int
m)
{
if
(m
n)
{
return
0;
}
return
exp(lnchoose(n,
m));
}
用之前调用math.h头文件,用的话直接把值赋给choose()这个函数即可,直接调用上面的函数,返回一个double数值,可追问
用C语言求组合数
实现的算法很多, 下面给出一个不需要递归的算法; 需要设计两个函数。
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扩展。。。
C语言求组合数
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;
}
名称栏目:c语言用函数求组合数 编写函数求组合数
转载来源:http://lswzjz.com/article/hhcdso.html