排列、组合、全排列、全组合——Java实现
排列的定义: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
公式:全排列数f(n)=n!(定义0!=1)
组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
符号说明:
- C-Combination 组合数
- A-Arrangement 排列数(在旧教材为P-Permutation)
- N-Number 元素的总个数
- M- 参与选择的元素个数
!- Factorial阶乘
- 排列
- 组合
- 全排列
所谓全排列,就是打印出字符串中所有字符的所有排列。
例如输入字符串abc,则全排列是 abc、acb、bac、bca、cab 和 cba
候补
排列方式:
组合方式:
排列数的计算公式:
/**
* 排列数,A(n,m) = n*(n-1)*(n-2)……*(n-m+1);
*/
public int arragement(int n,int m) {
if(n<m) {
System.out.println("n>m,输入错误");
}
int mul = 1;
for(int i = n-m+1;i<=n;i++) {
mul *= i;
}
return mul;
}
组合数的计算公式
/**
* 组合数,C(n,m) = A(n,m)/m!
*/
public int combination(int n,int m) {
if(n<m) {
System.out.println("n>m,输入错误");
}
int factM = 1;
for(int i = 1;i<=m;i++) {
factM *= i;
}
int a = arragement(n,m);
return a/factM;
}