我们知道,计算排列A(n,m)和组合C(n,m)可以用先求阶乘的方式实现,但是当数很大时求阶乘很容易溢出,所以这里给出非阶乘的方式求排列组合
求排列
分母和分子可以抵消,最后代码如下
unsigned long long A(int n, int m) {unsigned long long result = 1;for (int i = 0; i < m; i++) {result *= (n - i);}return result;
}
求组合
unsigned long long C(int n, int m) {if(m > n - m){ //因为C(n,m)=C(n,n-m),可以简化m = n - m;}unsigned long long result = 1;for (int i = 0;i < m; i++){result *= (n-i); //将result乘(n-i),计算分子部分,即n*(n-1)*...* (n-m+1)result /= (i+1); //将result除以(i+1),计算分母部分,即m!}return result;
}
由于结果肯定是非负数,所以可以用unsigned long long数据类型,能表示0~2^64-1,范围比较大