1. 程式人生 > >運用對數函數<計算組合數>

運用對數函數<計算組合數>

class () color 整理 turn 組合 blog amp gpo

先貼上一張組合數的基本公式吧,在這裏我們暫且規定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; }

運用對數函數<計算組合數>