从m个数中随机取出n个数,有多少种组合(忽略顺序)。即Cmn,m为下标,n为上标。
公式Cmn = m!/n!/(m-n)!
从公式中可以看出实际上就是计算一个数的阶乘,阶乘计算出来了,就是个除法的运算而已。
代码如下:
/**
* 求排列组合
* m为下标, n为上标
* 结果是m!/n!/(m-n)!
*/
public static double Cmn(int m, int n){
return devide(devide(recurrence(m), recurrence(n)).doubleValue(), recurrence(m-n)).doubleValue();
}
/**
* 递归计算一个数的阶乘
* @param num
* @return
*/
public static double recurrence(int num){
if(num<=1)
return 1;
else
return num*recurrence(num-1);
}
/**
* 计算m/n
* @param m
* @param n
* @return
*/
public static BigDecimal devide(double m, double n){
return BigDecimal.valueOf(m).divide(BigDecimal.valueOf(n),2, BigDecimal.ROUND_HALF_UP);
}