我有一项作业要求我们用 C++ 编写一个程序,该程序从用户那里获取彩票号码数量和彩票抽奖号码数量的输入。然后它应该计算用户得到正确数字的几率。这是(或多或少)我用 C++ 编写的第一个程序,所以我对此很陌生。到目前为止,我所拥有的如下。我正在寻求有关使该程序正常运行的帮助。我可以为声明的变量获取值,但无法弄清楚如何写下我实际需要做的事情——这是一个阶乘函数。我知道这个函数,只是不知道如何在 C++ 中说
据我目前的理解,它应该看起来像这样:
for (int i = 1; i <= k; i++) { 结果 = (结果 * (n+1-i))/i;
或类似的东西?....至少这是我在过去几个小时在线搜索答案时遇到的情况。我想我快要搞清楚了,但我遇到了障碍。
我不希望有人直接告诉我答案。如果您能向我解释我做错了什么以及我可以做些什么来解决它,那将对我最有帮助。
#include <iostream>
#include <iomanip>
using namespace std;
int main (int argc, char** argv)
{
int n, k;
int odds;
cout<< "How many numbers are printed on the lottery ticket? ";
cin >> n ;
cout<<"How may numbers are selected in the lottery drawing? ";
cin >> k ;
cout << "You entered " << n << " for how many numbers are printed on the lottery ticket, and "
<< k << " for how many numbers are selected in the lottery drawing." << endl;
for (int i = 1; i <= k; i++)
{
odds = (n * (n-k++))/k;
cout << odds;
}
return 0;
}
当我运行它时,我只会得到无穷无尽的“3-3-3-3 ....”。这是马不停蹄的。有一次我得到一个数字作为输出(一个非常大的错误数字),但是当我修改它时我无法取回它。
如有任何指导,我们将不胜感激。
最佳答案
这对于第一次作业来说似乎有点困难,除非你已经完成了计算机科学类(class)的大部分类(class)并且只是 C++ 的新手。
赔率公式通常被称为“组合数”,通常以阶乘形式表示。但是您不能在计算机上有效地操纵这些阶乘;它们对于任何内置数据类型来说都太大了。
相反,重要的是取消分子和分母中的相似项。交叉乘法和除法可以提供更多帮助。
我之前在另一个问题上发布了组合数量的工作代码:
您当前的代码实际上确实很好地交错了一些东西,但是您根本没有注意 i
和 k
和 n< 的含义
,并且在序列点之间读取和写入变量时,您还会遇到未定义的行为。
具体来说,这是非法的,因为分母中的 k
是不稳定的,因为它正在递增:
odds = n*(n-k++)/k;
您根本不应该在此处更改 k
。从1
到k
的值是i
。所以这变成了:
odds = n * (n-i) / i;
您需要在循环迭代中累积所有项,因此您应该乘以之前的 odds
值:
odds = odds * (n - i) / i;
但是您确实需要在分子中使用 n - 0
,但在分母中不需要 0
。你被选中使 i
以一为基础,你就是需要调整的分子:
odds = odds * (n + 1 - i) / i;
现在您的代码与我的非常接近。根据您的 n
和 k
值,您可能仍会溢出。将 odds
的数据类型更改为 long long
或 double
应该会有所帮助。
关于c++ - 彩票中奖概率 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790863/