我必须制作一个代码,根据可供选择的数量以及必须选择的数量来计算赢得彩票的概率。我必须在代码中使用因子方程(n!)/(k!*(n-k)!)
。代码本身工作正常,但方程式无法编译。
//This program calculates the probability of winning the lottery
#include <iostream>
using namespace std;
double factorial(int n, int k);
int main()
{
//variables
int n;
int k;
char pa;
int chance;
double prob;
//loop
do
{
cout << "How many numbers (1-12) are there to pick from?\n" << endl;
cin >> n;
if(n>12 || n<1)
{
cout << "Invalid entry.\nHow many numbers (1-12) are there to pick from?\n";
cin >> n;
}
cout << "How many numbers must you pick to play?\n";
cin >> k;
if(k>n || k<1)
{
cout << "Invalid entry.\nHow many numbers must you pick to play?\n";
cin >> n;
}
cout << "Your chance of winning the lottery is 1 in " << chance << endl;
prob=factorial( n, k);
cout << "This is a probability of " << prob << endl;
cout << "Play again?";
cin >> pa;
} while (pa != 'n');
return 0;
}
double factorial(int n, int k)
{
double fact;
fact=(n!)/(k!*(n-k)!);
return fact;
}
答案 0 :(得分:1)
在C ++中没有!运算符作为阶乘运算的意义,而您的factorial
函数不计算阶乘。 (!运算符通常是逻辑 NOT 运算符。)
这就是编写阶乘方法的方法,
int factorial(int n) {
return (n <= 1 ? 1 : n * factorial(n - 1));
}
该方法是递归的并且在整数上运行 - 您可能需要考虑这是否适合您的任务
然后,您的原始函数应该按double choice(int n, int k)
的行重命名,并使用新的factorial
实现。
答案 1 :(得分:0)
你不能写n!
并期望它计算n
的阶乘。
将fact=(n!)/(k!*(n-k)!)
更改为fact=f(n)/(f(k)*f(n-k))
,并添加以下功能:
unsigned long long f(int n)
{
unsigned long long res = 1;
while (n > 1)
{
res *= n;
n--;
}
return res;
}
顺便说一句,您的代码中还有其他几个问题:
您正在使用变量chance
而未初始化它。
函数factorial
不返回概率,而是返回不同选择的数量。这是一个整数值,您也可以使用unsigned long long
代替double
。概率是值(1/value
)的倒数,因此您应该相应地更改打印的消息。