排列组合的实现
// 实现排列A(n,m) ,c461 #include <stdio.h> int m,n,a[30]; long s=0; void main() { int p(int k); printf(" input n (n<10):"); scanf("%d",&n); printf(" input m(1<m<=n):"); scanf("%d",&m); p(1); // 从第1个数开始 printf("\n 总数为:%ld \n", s); // 输出A(n,m)的值 } // 排列递归函数p(k) int p(int k) { int i,j,u; if(k<=m) { for(i=1;i<=n;i++) { a[k]=i; // 探索第k个数赋值i for(u=0,j=1;j<=k-1;j++) if(a[k]==a[j]) // 若出现重复数字 u=1; // 若第k数不可置i,则u=1 if(u==0) // 若第k数可置i,则检测是否到m个数 { if(k==m) // 若已到m个数时,则打印出一个解 { s++; printf(" "); for (j=1;j<=m;j++) printf("%d",a[j]); if(s%10==0) printf("\n"); } else p(k+1); // 若没到m个数,则探索下一个数 p(k+1) } } } return s; } // 递归实现组合C(n,m),c462 #include <stdio.h> int m,n,a[100]; long s=0; void main() { int c(int k); printf(" input n (n<10):"); scanf("%d",&n); printf(" input m(1<m<=n):"); scanf("%d",&m); c(1); // 从第1个数开始 printf("\n C(%d,%d)=%ld \n",n,m,s); // 输出C(n,m)的值 } // 组合递归函数c(k) int c(int k) { int i,j; if(k<=m) { a[0]=0; for(i=a[k-1]+1;i<=n+k-m;i++) { a[k]=i; // 探索第k个数赋值i { if(k==m) // 若已到m个数时,则打印出一个解 { s++; printf(" "); for (j=1;j<=m;j++) printf("%d",a[j]); if(s%10==0) printf("\n"); } else c(k+1); // 若没到m个数,则探索下一个数 c(k+1) } } } return s; } // 从n个不同元素取r个与另m个相同元素的复杂排列,c463 #include <stdio.h> int m,n,r,a[30]; long s=0; void main() { int p(int k); printf(" input n: "); scanf("%d",&n); printf(" input r(1<r<=n): "); scanf("%d",&r); printf(" input m: "); scanf("%d",&m); printf(" 从%d个不同元素取%d个与另%d个相同元素的排列:\n",n,r,m); p(1); // 从第1个数开始 printf("\n s=%ld \n",s); // 输出复杂排列的个数 } // 复杂排列递归函数 int p(int k) { int h,i,j,u; if(k<=r+m) { for(i=0;i<=n;i++) { a[k]=i; // 探索第k个数赋值i for(u=0,j=1;j<=k-1;j++) if(a[j]!=0 && a[k]==a[j]) // 若出现非零元素相同,则u=1 u=1; if(u==0) // 若第k数可置i,则检测是否r+m个数 { if(k==r+m) // 若已到r+m个数则检测0的个数h { for(h=0,j=1;j<=r+m;j++) if(a[j]==0) h++; if(h==m) // 若相同元素0的个数为m个,输出一排列 { s++; printf(" "); for(j=1;j<=r+m;j++) printf("%d",a[j]); if(s%10==0) printf("\n"); } } else p(k+1); // 若没到r+m个数,则探索下一个数 p(k+1) } } } return s; }