一般排列组合计算
1.排列組合公式
若按照階乘的方式來計(jì)算,在數(shù)值較大時(shí)可能發(fā)生溢出。 觀察可以發(fā)生C(n,r)的分子分母都為r項(xiàng),可以把它們的每一項(xiàng)分別進(jìn)行計(jì)算。在編程時(shí)要注意除不進(jìn)時(shí),不要除,把分子分母分別乘到下一個(gè)處理項(xiàng)中。 同時(shí) C(n,r)=C(n,n-r) 例:每行輸入兩個(gè)數(shù)分別代表上面的n,r。若n,r=0則終止。 /* Note:Your choice is C IDE */ #include "stdio.h" void main() {int n,r;// int count=1;int i;int a=1,b=1;while(scanf("%d%d",&n,&r)&&n){if(r>n-r)//減小計(jì)算的項(xiàng)r=n-r;for(i=1;i<=r;i++){a*=n-i+1;b*=i;if(a%b==0){a/=b;b=1;} }printf("%d\n",a/b);a=1,b=1; }}2
2.二項(xiàng)式系數(shù)公式,即降階公式
C(n,r)=C(n-1,r)+C(n-1,r-1).可以理解先從n個(gè)中選r-1個(gè),然后在n-1個(gè)中選r-1個(gè),其中一個(gè)就是被排除在n-1中的一個(gè)。所以C(i,j)=C(i-1,j)+C(i-1,j-1)而C(x,0)=1,所以C(1,1)=C(1,0)=1;C(2,1)=C(1,1)+C(1,0)=1+1=2;C(3,1)=C(2,1)+C(2,0)=2+1=3;C(3,2)=C(2,2)+C(2,1)=1+2=3;.......若用數(shù)組來存儲(chǔ)這些組合的計(jì)算,C[i][j]=C[i-1][j]+C[i-1][j-1];初始時(shí)設(shè)C[i][0]=1,(0<=i<=101) 然后雙重枚舉i,j,按上面公式計(jì)算。/* Note:Your choice is C IDE */ #include "stdio.h" #define N 110 unsigned int C[N][N];//用于存數(shù)各排序組合數(shù) void prepare() { int i,j;memset(C,0,sizeof(C));for(i=0;i<N;i++){C[i][0]=1;C[i][i]=1;}for(i=1;i<N;i++){for(j=0;j<i;j++){C[i][j]=C[i-1][j]+C[i-1][j-1]; }}}void main() {int n,m;prepare();//先離線計(jì)算各式while(scanf("%d%d",&n,&m)&&n)printf("%d\n",C[n][m]); }轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lin200753/article/details/33329613
總結(jié)
- 上一篇: 共享出行的最后一片战场
- 下一篇: 用电梯服务器怎样解电梯显示E34,成为电