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