具有阶乘方程的概率计算器

时间:2014-02-14 22:30:29

标签: c++ probability factorial

我必须制作一个代码,根据可供选择的数量以及必须选择的数量来计算赢得彩票的概率。我必须在代码中使用因子方程(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;
}

2 个答案:

答案 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;
}

顺便说一句,您的代码中还有其他几个问题:

  1. 您正在使用变量chance而未初始化它。

  2. 函数factorial不返回概率,而是返回不同选择的数量。这是一个整数值,您也可以使用unsigned long long代替double。概率是值(1/value)的倒数,因此您应该相应地更改打印的消息。