c++ 小明参加一个比赛,规则是:每组卡牌有十张且点数为 1 到 10,现有 n 组卡牌,选手要在 n 组卡牌中,每组抽取一张,共抽 n 张;若 n 张卡牌的总点数大于 k 则小明获胜,求小明获胜的概率有多大? 输入 两个整数 n,k。
时间: 2024-02-11 10:07:40 浏览: 142
好的,下面是 C++ 实现:
```c++
#include <iostream>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
// 计算不满足条件的抽卡方案数
long long not_win = 0;
for (int i = 0; i <= n; i++) {
long long coeff = ((i & 1) ? -1 : 1) * binomial(n, i);
not_win += coeff * binomial(k - 10 * i + n - 1, n - 1);
}
// 计算获胜概率
double win_prob = 1.0 - (double)not_win / pow(10, n);
cout << win_prob << endl;
return 0;
}
// 计算组合数 C(n, m)
long long binomial(int n, int m) {
long long res = 1;
for (int i = 1; i <= m; i++) {
res = res * (n - i + 1) / i;
}
return res;
}
```
该程序中用到了 `binomial` 函数,用来计算组合数,可以使用递推公式 $C(n, m) = C(n-1, m) + C(n-1, m-1)$ 或者阶乘公式 $C(n, m) = n!/(m!(n-m)!)$ 来实现。这里采用了阶乘公式,但是为了避免溢出,使用了循环计算的方式,每次只乘一个数,并且在乘完后除以一个数,避免了中间结果超过 `long long` 范围的问题。
阅读全文