计算排列组合

1到11里面选1个,12到22里面选1个,23到33里面选1个,然后再随机选3个。
组合数 =COMBIN(33,6)-3COMBIN(22,6)+3COMBIN(11,6)=885115

sql计算如下:

WITH RECURSIVE t(a) AS (SELECT 1
 UNION SELECT a+1 from t where a<33
)
SELECT count(*) FROM t a, t b, t c, t d    , t e   , t f
where a.a<b.a
  and b.a<c.a
  and c.a<d.a
  and d.a<e.a
  and e.a<f.a 
  and a.a BETWEEN 1 and 11
  and f.a BETWEEN 23 and 33
  and(b.a BETWEEN 12 and 22 
  or  c.a BETWEEN 12 and 22 
  or  d.a BETWEEN 12 and 22 
  or  e.a BETWEEN 12 and 22 
  )
在C++中计算排列组合通常可以使用两种方法:直接计算和使用数学公式。对于直接计算,可以通过递归的方式实现排列,而对于组合,则可以通过求幂的方式实现。此外,也可以直接利用数学公式进行计算,例如nCr = n! / [r! * (n-r)!],其中"!"表示阶乘。 1. **递归实现排列(Permutation)**: ```cpp #include <iostream> void permute(int arr[], int l, int r, std::vector<std::vector<int>>& result) { if (l == r) { result.push_back(std::vector<int>(arr, arr + r + 1)); } else { for (int i = l; i <= r; i++) { std::swap(arr[l], arr[i]); permute(arr, l + 1, r, result); std::swap(arr[l], arr[i]); // backtrack } } } std::vector<std::vector<int>> getPermutations(int arr[], int n) { std::vector<std::vector<int>> result; permute(arr, 0, n - 1, result); return result; } int main() { int arr[] = {1, 2, 3}; int n = sizeof(arr) / sizeof(*arr); std::vector<std::vector<int>> permutations = getPermutations(arr, n); for (const auto& perm : permutations) { for (int num : perm) { std::cout << num << " "; } std::cout << std::endl; } return 0; } ``` 2. **使用数学公式计算组合(Combination)**: ```cpp #include <iostream> long long factorial(int n) { long long result = 1; for (int i = 2; i <= n; ++i) { result *= i; } return result; } long long nCr(int n, int r) { return factorial(n) / (factorial(r) * factorial(n - r)); } int main() { int n = 5, r = 2; std::cout << "Number of combinations " << n << "C" << r << " = " << nCr(n, r) << std::endl; return 0; } ``` 请注意,上述代码示例中的阶乘实现和组合的计算方法在数值较大时可能会导致溢出。在实际应用中,可以使用更大范围的数据类型如`long long`或者使用库函数(例如`boost::multiprecision`)来处理大数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值