Find the length of factorial of a number in any given base
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: 2
Explanation: 4! = 24, hence number of digits is 2
Input: n = 4, b = 16
Output: 2
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 <bits/stdc++.h> 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
<script> // 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 function findDigits(n, b) { // factorial of -ve number // doesn't exists if (n < 0) return 0; // base case if (n <= 1) return 1; var M_PI = 3.141592; var M_E = 2.7182; // Use Kamenetsky formula to calculate // the number of digits var x = ((n * Math.log10(n / M_E) + Math.log10(2 * M_PI * n) / 2.0)) / (Math.log10(b)); return Math.floor(x) + 1; } // Driver Code // calling findDigits(Number, Base) document.write(findDigits(4, 16) + "<br>" ); document.write( findDigits(5, 8) + "<br>" ); document.write( findDigits(12, 16) + "<br>" ); document.write( findDigits(19, 13) + "<br>" ); // This code is contributed by rutvik_56. </script> |
2 3 8 16
Reference:oeis.org