// 实现排列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;
}