正文

[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)=120
indirect: C(10,3)=120
======================

阅读(6071) | 评论(3)


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

评论

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