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