递归因子函数无法正常工作

时间:2014-02-11 14:02:47

标签: c++ recursion

为什么这个递归函数最多只能计算(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;
}

2 个答案:

答案 0 :(得分: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

当数字大于最大值时,行为未定义。在大多数计算机上发生的事情是它包裹到最负数。


答案 1 :(得分:2)

因为整数型long long有它可以存储的最大值。您可以使用以下语句获取它

#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