我有一项任务要求我们用C ++制作一个程序,该程序从用户那里获取彩票上的数字量以及彩票中的数字量。然后它应该计算用户获得数字正确的几率。这是(或多或少)我用C ++编写的第一个程序,所以我是新手。我到目前为止的内容如下。我正在寻求帮助,使程序工作。我可以为声明的变量获取值,但无法弄清楚如何写下我实际需要做的事情 - 这是一个阶乘函数。我知道这个功能,只是不知道如何在C ++中说
据我所知,此时应该看起来像这样:
for(int i = 1; i< = k; i ++){ result =(result *(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;
}
当我跑步时,我得到了无穷无尽的&#34; 3-3-3-3 ....&#34;。它不停。有一次我得到了一个数字作为输出(一个非常大的不正确的数字),但是当我在修补它时我无法得到它。
任何指导都将不胜感激。
答案 0 :(得分:2)
对于第一次作业来说,这似乎有点困难,除非您通过计算机科学课程并且只是C ++新手的大部分内容。
赔率的公式,通常称为&#34;组合数&#34;,经常用阶乘法写成。但是你无法在计算机上有效地操纵这些因子;它们对于任何内置数据类型都太大了。
相反,从分子和分母中取消类似的术语非常重要。交错乘法和除法可以提供更多帮助。
我以前在另一个问题上发布了多个组合的工作代码:
您当前的代码实际上确实存在交错的问题,但您对i
和k
以及n
的含义一直保持谨慎,而您#&# 39;在序列点之间读取和写入变量时,也有未定义的行为。
具体来说,这是非法的,因为分母中的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
应该会有所帮助。
答案 1 :(得分:0)
这是您需要的公式:
http://en.wikipedia.org/wiki/Lottery_mathematics
确保掌握好数学知识。从实现该公式的函数开始。
一旦掌握了公式,你就会意识到幼稚的学生因素将无法运作。你可以拥有的最大的天真因素是20!之后就溢出了。
正确的方法是对数和伽玛函数:
https://en.wikipedia.org/wiki/Gamma_function
所以这个公式将变成:
ln{n!/k!(n-k)!)} = ln(n!) - ln(k!) - ln((n-k)!)
但是自gamma(n+1) = n!
lngamma(n+1) - lngamma(k+1) - lngamma(n-k-1)
gamma函数返回双精度数,而不是整数或长数。它对你来说会更好。