Я написал простую программу на C++, которая вычисляет перестановки/факториалы в 2 разных методах. Проблема возникает, когда я пытаюсь использовать более длинный метод (p1) с 20 и 2. Предоставлено «20!» ОГРОМНОЕ число. Есть ли предел с целыми числами при вычислении факториала с использованием метода рекурсии?int limit в программе перестановок (C++)
#include <iostream>
using namespace std;
int p1(int n, int r);
int p2(int n, int r);
int factorial(int x);
int main()
{
cout << p1(10, 8) << endl;
cout << p2(10, 8) << endl;
cout << p1(4, 3) << endl;
cout << p2(4, 3) << endl;
cout << p1(20, 2) << endl; // THE NUMBER PRINTS INCORRECTLY HERE
cout << p2(20, 2) << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
int p1(int n, int r) // long version, recursively calls factorial
{
return (factorial(n)/factorial(n - r));
}
int factorial(int x)
{
if (x == 0)
return 1;
else if (x > 0)
return (x * factorial(x - 1));
}
int p2(int n, int r) // shortcut, does arithmetic in for loop
{
int answer = n;
for (int i = 1; i < r; i++)
{
answer *= n - 1;
n--;
}
return answer;
}
да есть предел. Используйте 'unsigned long long', чтобы немного увеличить предел. –
- это то, что я возвращаю (факторный (n)/factorial (n -r))? или внутри факториальной функции? Также (поскольку я новичок на этом сайте), есть ли простой способ включить строку # для кода, когда я отправляю сюда? – h4le5torm
'int factorial (int x)' должен быть 'unsigned long long factorial (unsigned long long x)', если вы хотите использовать большие числа. Но будет и предел. Только выше. И нет, вы не можете включить номера строк для своего кода, что было бы приятным прикосновением. –