2014-02-11 8 views
3

Почему эта рекурсивная функция может вычисляться только до (20!)? Когда я ввожу 21, он показывает неожиданный результат.Рекурсивная факториальная функция не работает должным образом

#include <iostream> 
using namespace std; 

long long int factorial(long long int number) 
{ 
    if(number <= 1) 
     return 1; 

    return number * factorial(number - 1); 

}

int main() 
{ 
    long long int number; 
    while(cin >> number) 
      cout << factorial(number) << endl; // factorial(20) = 2432902008176640000 
               // factorial(21) = -4249290049419214848 ???? 
    return 0; 
} 
+4

Это называется [переполнение] (http://en.wikipedia.org/wiki/Integer_overflow). –

+0

Мне нравится этот пример одометра на странице Wiki. – Maroun

ответ

6

Фактор 21: 51090942171709440000. Долгосрочный подписанный на вашем компьютере может содержать максимум 2^63-1 = 9223372036854775807.

2432902008176640000 20 factorial 
9223372036854775807 2^63-1 (the maximum for a long long on your computer) 
51090942171709440000 21 factorial 

Когда число больше максимального, поведение не определено. Что происходит на большинстве компьютеров, так это то, что оно обтекает самое отрицательное число.


+0

В примечании: 'unsigned long long' тоже недостаточно. – Jarod42

+0

@Angew благодарит запомнить. я отредактирую свой ответ. –

2

Поскольку интегральный тип долго долго имеет максимум, что он может хранить. Вы можете получить его, используя следующее заявление:

#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout << std::numeric_limits<long long>::max() << std::endl; 
} 

Здесь приведены факториалы для типа long long при условии, что он занимает 8 байтов.

0: 1 
1: 1 
2: 2 
3: 6 
4: 24 
5: 120 
6: 720 
7: 5040 
8: 40320 
9: 362880 
10: 3628800 
11: 39916800 
12: 479001600 
13: 6227020800 
14: 87178291200 
15: 1307674368000 
16: 20922789888000 
17: 355687428096000 
18: 6402373705728000 
19: 121645100408832000 
20: 2432902008176640000 
Смежные вопросы