我們知道,計算排列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,范圍比較大