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