当前位置: 移动技术网 > IT编程>软件设计>面向对象 > 运用对数函数<计算组合数>

运用对数函数<计算组合数>

2018年02月03日  | 移动技术网IT编程  | 我要评论

先贴上一张组合数的基本公式吧,在这里我们暂且规定n为下标,m为上标(n≥m)

C(n,m) = n! / [ m!(n-m)! ]

以下思路借鉴于某位大神,为了方便自己理解,我稍微做了些整理。

希望能帮助到和我一样热爱学习的小白=-=~

#include "stdio.h"
#include "math.h" 
double lncom(int n,int m)     //在c语言中,log函数也就是我们通常所说的ln函数,即以e为底的对数函数
{
    double s1=0,s2=0,i;       //s1=n!/m!  s2=1/(n-m)!
    
    if(m<n/2.0)m=n-m;         //如果上标小于下标的一半,此时m<n-m,令m=n-m,使计算更加快捷
       
    for(i=m+1;i<=n;i++)       //s1作为分子,从m+1累乘至n
    s1=s1+log(i);
    
    for(i=2;i<=n-m;i++)       //s2作为分母,从1累乘至n-m
    s2=s2+log(i);
    
    return s1-s2;             
}
double com(int n,int m)
{
    if(n<m)return 0;          //因为n≥m,所以这种情况不存在
    
    return exp(lncom(n,m));   //把经过处理的组合数还原出来
}
int main()
{
    int n,m;                  //n是下标,m是上标
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        printf("%lf\n",com(n,m));
    } 
    return 0;
}

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网