Broken Calculator (Quiz -- Arrays)

Q) Andrew was attempting a mathematics test where he needed to solve problems with factorials. One such problem had an answer which equaled 100! ,He wondered what would this number look like. He tried to calculate 100! On his scientific calculator but failed to get a correct answer. Can you write a code to help Andrew calculate factorials of such large numbers?

Input Format
a single lined integer N

Constraints
1 < = N < = 500

Output Format
Print the factorial of N

Sample Input
5
Sample Output
120
Explanation
for factorial of 5 we have 5 x 4 x 3 x 2 x 1 = 120

Code implemented by me :-

#include

using namespace std;

long unsigned int rec ( int x )
{

long unsigned int f ;

if ( x == 1 || x == 0 )
return ( 1 ) ;

else
{
    
    f = x * rec ( x - 1 ) ;
    return ( f ) ;
}

}

int main( )
{

long unsigned int a, fact ;
// cout << "Enter any number " ;
cin >> a;

fact = rec ( a ) ;

// cout << "Value: "<<fact;

cout << fact;

return 0;
}

In this above code, I am getting the correct answer upto some extent but not for all TEST CASES.

Can you Please figure out the problem and update my code.
Else, Provide me the code for the above Question.

Thank You

Problem in Your Approach
Factorial of 100 has 158 digits. It is not possible to store these many digits even if we use long long int.

smallest no with 158 digit is 10^157
so you can imagine how large is no

Correct Approach :
you have to use arrays to store digits of number

Create an array ‘res[]’
Initialize value stored in ‘res[]’ as 1 and initialize ‘res_size’ (size of ‘res[]’) as 1.
Do following for all numbers from x = 2 to n.
……a) Multiply x with res[] and update res[] and res_size to store the multiplication result.

How to multiply a number ‘x’ with the number stored in res[]?

The idea is to use simple school mathematics. We one by one multiply x with every digit of res[]. The important point to note here is digits are multiplied from rightmost digit to leftmost digit. If we store digits in same order in res[], then it becomes difficult to update res[] without extra space. That is why res[] is maintained in reverse way, i.e., digits from right to left are stored.

multiply(res[], x)
Initialize carry as 0.
Do following for i = 0 to res_size – 1
….a) Find value of res[i] * x + carry. Let this value be prod.
….b) Update res[i] by storing last digit of prod in it.
….c) Update carry by storing remaining digits in carry.
Put all digits of carry in res[] and increase res_size by number of digits in carry.

in the below example we are multiplying 5189 with 10
remember in array nos are stored in reverse order for ease of calculation

Complete Code