正文

[075] 求排列组合总数的函数2006-12-01 12:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/21132.html

分享到:

看到一个用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======================

阅读(13849) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册