Я должен сделать код, который вычисляет вероятность выигрыша в лотерее, учитывая количество номеров, из которых вы можете выбирать, и сколько вы должны выбрать. Я должен использовать факториальное уравнение (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;
}
Здесь нет ! оператор в C ++ в смысле факториальной операции, и ваш factorial
функция не вычисляет факториал. (The ! Оператор, как правило, логичный НЕ оператор).
Вот как можно написать факторный метод,
int factorial(int n) {
return (n <= 1 ? 1 : n * factorial(n - 1));
}
Этот метод является рекурсивным и работает с целыми числами — возможно, вам придется подумать, подходит ли он для вашей задачи
Тогда ваша оригинальная функция должна быть переименована в соответствии с double choice(int n, int k)
и использовать новый factorial
реализация.
Вы не можете написать 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
), поэтому вы должны соответствующим образом изменить напечатанное сообщение.