看到一个用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)=120indirect: C(10,3)=120======================

评论