Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recursive factorial function not working properly

Tags:

c++

recursion

Why this recursive function can only calculate up to (20!) ? When I input 21 it shows unexpected result.

#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;
}
like image 547
mhm Avatar asked Dec 04 '25 16:12

mhm


2 Answers

The factorial of 21 is 51090942171709440000. A signed long long on your computer can hold has a maximum of 2^63-1 = 9223372036854775807.

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

When a number is larger than the maximum then behavior is undefined. What happens on most computers is that it wraps around to the most negative number.


like image 120
Bernd Elkemann Avatar answered Dec 08 '25 05:12

Bernd Elkemann


Because integral type long long has its maximum that it can store. You can get it using the following statement

#include <iostream>
#include <limits>

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

Here are factorials for type long long provided that it occupies 8 bytes.

 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
like image 35
Vlad from Moscow Avatar answered Dec 08 '25 04:12

Vlad from Moscow