欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-10 18:27:14
先贴上一张组合数的基本公式吧,在这里我们暂且规定n为下标,m为上标(n≥m) C(n,m) = n! / [ m!(n-m)! ] 以下思路借鉴于某位大神,为了方便自己理解,我稍微做了些整理。 希望能帮助到和我一样热爱学习的小白 ~ ......

先贴上一张组合数的基本公式吧,在这里我们暂且规定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;
}