看到一个用C语言求排列组合总数的题,一时记不起公式了,翻了下概率书才想起,
排列数公式Pmn =m(m-1)…(m-n+1) , 可以用求阶乘的方法来做。
求出排列数,组合数就简单了,Cmn=Pmn /n! 而n!=Pnn。
根据这个思路,设计程序如下:
#include <stdio.h>
float P(int m, int n) /* 求排列数函数*/
{
int i;
float t = m;
for(i = 1; i < n; i++)
{
t = t * (m - i);
}
return t;
}
int main()
{
int m;
int n;
float s;
scanf("%d %d", &m, &n);
s = P(m, n) / P(n, n); /* 由排列数得到组合数 */
printf("C(%d,%d)=%-5.0f\n", m, n, s);
return 0;
}
运行结果(VC):
==========================
10 3↙
C(10,3)=120
==========================
[相关] [033] 阶乘->数据的范围
[补充] 直接计算组合数的公式为: Cmn=m!/(n!*(m-n)!), 按此公式编写程序如下:
#include <stdio.h>
float P(int m, int n) /* 求排列数函数 */
{
int i;
float t = m;
for(i = 1; i < n; i++)
{
t = t * (m - i);
}
return t;
}
float C(int m, int n) /* 求组合数函数 */
{
int i;
float a = 1; /* a为m!, 初值为1 */
float b = 1; /* b为n!, 初值为1 */
float c = 1; /* c为(m-n)!, 初值为1 */
for(i = 1; i <= m; i++) /* 求m的阶乘 */
a = a * i;
for(i = 1; i <= n; i++) /* 求n的阶乘 */
b = b * i;
for(i = 1; i <= (m - n); i++) /* 求m-n的阶乘 */
c = c * i;
return (a / (b * c));
}
int main()
{
int m;
int n;
float s;
scanf("%d %d", &m, &n);
printf("direct: C(%d,%d)=%-5.0f\n", m, n, C(m, n)); /* 直接求得组合数 */
s = P(m, n) / P(n, n); /* 由排列数间接得到组合数 */
printf("indirect: C(%d,%d)=%-5.0f\n", m, n, s);
return 0;
}
运行结果(VC):
======================
10 3↙
direct: C(10,3)=120
indirect: C(10,3)=120
======================
评论