Skip to content

# Find the length of factorial of a number in any given base

• Last Updated : 12 Apr, 2021

Given an integer n and base B, the task is to find the length of n! in base B
Examples:

Input: n = 4, b = 10
Output:
Explanation: 4! = 24, hence number of digits is 2
Input: n = 4, b = 16
Output:
Explanation: 4! = 18 in base 16, hence number of digits is 2

Approach:
In order to solve the problem we use Kamenetsky’s formula which approximates the number of digits in a factorial

`f(x) =    log10( ((n/e)^n) * sqrt(2*pi*n))`

The number of digits in n to the base b is given by logb(n) = log10(n) / log10(b). Hence, by using properties of logarithms, the number of digits of factorial in base b can be obtained by

`f(x) = ( n* log10(( n/ e)) + log10(2*pi*n)/2  ) / log10(b)`

This approach can deal with large inputs that can be accommodated in a 32-bit integer and even beyond that!
Below code is the implementation of above idea :

## C++

 `// A optimised program to find the ` `// number of digits in a factorial in base b` `#include ` `using` `namespace` `std;`   `// Returns the number of digits present ` `// in n! in base b Since the result can be large` `// long long is used as return type` `long` `long` `findDigits(``int` `n, ``int` `b)` `{` `    ``// factorial of -ve number ` `    ``// doesn't exists` `    ``if` `(n < 0)` `        ``return` `0;`   `    ``// base case` `    ``if` `(n <= 1)` `        ``return` `1;`   `    ``// Use Kamenetsky formula to calculate` `    ``// the number of digits` `    ``double` `x = ((n * ``log10``(n / M_E) + ` `                ``log10``(2 * M_PI * n) /` `                ``2.0)) / (``log10``(b));`   `    ``return` `floor``(x) + 1;` `}`   `// Driver Code` `int` `main()` `{` `    ``//calling findDigits(Number, Base)` `    ``cout << findDigits(4, 16) << endl;` `    ``cout << findDigits(5, 8) << endl;` `    ``cout << findDigits(12, 16) << endl;` `    ``cout << findDigits(19, 13) << endl;` `    ``return` `0;` `}`

## Java

 `// A optimised program to find the ` `// number of digits in a factorial in base b` `class` `GFG{` ` `  `// Returns the number of digits present ` `// in n! in base b Since the result can be large` `// long is used as return type` `static` `long` `findDigits(``int` `n, ``int` `b)` `{` `    ``// factorial of -ve number ` `    ``// doesn't exists` `    ``if` `(n < ``0``)` `        ``return` `0``;` ` `  `    ``// base case` `    ``if` `(n <= ``1``)` `        ``return` `1``;` `    ``double` `M_PI = ``3.141592``;` `    ``double` `M_E = ``2.7182``;` `    `  `    ``// Use Kamenetsky formula to calculate` `    ``// the number of digits` `    ``double` `x = ((n * Math.log10(n / M_E) + ` `            ``Math.log10(``2` `* M_PI * n) /` `                ``2.0``)) / (Math.log10(b));` ` `  `    ``return` `(``long``) (Math.floor(x) + ``1``);` `}` ` `  `// Driver Code` `public` `static` `void` `main(String[] args)` `{` `    ``//calling findDigits(Number, Base)` `    ``System.out.print(findDigits(``4``, ``16``) +``"\n"``);` `    ``System.out.print(findDigits(``5``, ``8``) +``"\n"``);` `    ``System.out.print(findDigits(``12``, ``16``) +``"\n"``);` `    ``System.out.print(findDigits(``19``, ``13``) +``"\n"``);` `}` `}`   `// This code is contributed by 29AjayKumar`

## Python 3

 `from` `math ``import` `log10,floor`   `# A optimised program to find the ` `# number of digits in a factorial in base b`   `# Returns the number of digits present ` `# in n! in base b Since the result can be large` `# long long is used as return type` `def` `findDigits(n, b):` `    `  `    ``# factorial of -ve number ` `    ``# doesn't exists` `    ``if` `(n < ``0``):` `        ``return` `0` `    `  `    ``M_PI ``=` `3.141592` `    ``M_E ``=` `2.7182`   `    ``# base case` `    ``if` `(n <``=` `1``):` `        ``return` `1`   `    ``# Use Kamenetsky formula to calculate` `    ``# the number of digits` `    ``x ``=` `((n ``*` `log10(n ``/` `M_E) ``+` `log10(``2` `*` `M_PI ``*` `n) ``/` `2.0``)) ``/` `(log10(b))`   `    ``return` `floor(x) ``+` `1`   `# Driver Code` `if` `__name__ ``=``=` `'__main__'``:` `    `  `    ``#calling findDigits(Number, Base)` `    ``print``(findDigits(``4``, ``16``))` `    ``print``(findDigits(``5``, ``8``))` `    ``print``(findDigits(``12``, ``16``))` `    ``print``(findDigits(``19``, ``13``))`   `# This code is contributed by Surendra_Gangwar`

## C#

 `// A optimised C# program to find the ` `// number of digits in a factorial in base b ` `using` `System;`   `class` `GFG{ ` `    `  `    ``// Returns the number of digits present ` `    ``// in n! in base b Since the result can be large ` `    ``// long is used as return type ` `    ``static` `long` `findDigits(``int` `n, ``int` `b) ` `    ``{ ` `        ``// factorial of -ve number ` `        ``// doesn't exists ` `        ``if` `(n < 0) ` `            ``return` `0; ` `    `  `        ``// base case ` `        ``if` `(n <= 1) ` `            ``return` `1; ` `        ``double` `M_PI = 3.141592; ` `        ``double` `M_E = 2.7182; ` `        `  `        ``// Use Kamenetsky formula to calculate ` `        ``// the number of digits ` `        ``double` `x = ((n * Math.Log10(n / M_E) + ` `                ``Math.Log10(2 * M_PI * n) / ` `                    ``2.0)) / (Math.Log10(b)); ` `    `  `        ``return` `(``long``) (Math.Floor(x) + 1); ` `    ``} ` `    `  `    ``// Driver Code ` `    ``public` `static` `void` `Main(``string``[] args) ` `    ``{ ` `        ``// calling findDigits(Number, Base) ` `        ``Console.WriteLine(findDigits(4, 16)); ` `        ``Console.WriteLine(findDigits(5, 8)); ` `        ``Console.WriteLine(findDigits(12, 16)); ` `        ``Console.WriteLine(findDigits(19, 13)); ` `    ``} ` `} `   `// This code is contributed by Yash_R`

## Javascript

 ``

Output:

```2
3
8
16```

Reference:oeis.org

My Personal Notes arrow_drop_up
Recommended Articles
Page :