Dado un entero positivo N, tenemos que encontrar el número total de dígitos en el factorial de N elevado a la potencia N, es decir,
Ejemplos:
Input: 4 Output: 6 Explanations: = = 331776. Total number of digits in 331776 is 6. Input: 5 Output: 11 Explanations: = = 24883200000 Total number of digits in 24883200000 is 11. Input: 2 Output: 1 Input: 1000 Output: 2567605
La idea de la solución se describe a continuación.
Método de fuerza bruta: por fuerza bruta, ¡simplemente podemos calcular N! en tiempo O(N) y luego multiplicarlo n veces, pero ese será un método muy lento y excedería tanto el tiempo como el espacio porque sería un número enorme.
Método eficiente:
Veámoslo más de cerca. Podemos dividir (N!)^N en términos más simples que son fáciles de calcular. Al tomar el logaritmo común,
obtenemos
y sabemos,
por lo tanto, podemos reducir aún más.
Ahora podemos calcular la respuesta fácilmente en tiempo O(N) y sin exceder el límite de espacio.
Entonces, ¿por qué es una respuesta válida al problema?
Sabemos que el número total de dígitos en un número N cuya base es 10 se puede encontrar fácilmente tomando ceil(log10 (N)). Eso se hace exactamente en el enfoque descrito anteriormente.
La implementación del código de la idea anterior se da a continuación.
C++
// CPP program to find count of digits in N // factorial raised to N #include <bits/stdc++.h> using namespace std; int countDigits(int n) { // we take sum of logarithms as explained // in the approach double ans = 0; for (int i = 1; i <= n; i++) ans += log10(i); // multiply the result with n ans = ans * n; return 1 + floor(ans); } int main() { int n = 4; cout << countDigits(n) << "\n"; return 0; }
Java
// Java program to find // count of digits in N // factorial raised to N import java.io.*; class GFG { static int countDigits(int n) { // we take sum of logarithms // as explained in the approach double ans = 0; for (int i = 1; i <= n; i++) ans += Math.log10(i); // multiply the // result with n ans = ans * n; return 1 + (int)Math.floor(ans); } // Driver Code public static void main (String[] args) { int n = 4; System.out.println( countDigits(n) + "\n"); } } // This code is contributed // by anuj_67.
Python3
# python3 program to find count of digits in N # factorial raised to N import math def countDigits( n): # we take sum of logarithms as explained # in the approach ans = 0 for i in range (1,n+1): ans += math.log10(i) #multiply the result with n ans = ans * n return 1 + math.floor(ans) if __name__ == "__main__": n = 4 print (countDigits(n))
C#
// C# program to find // count of digits in N // factorial raised to N using System; class GFG { static int countDigits(int n) { // we take sum of logarithms // as explained in the approach double ans = 0; for (int i = 1; i <= n; i++) ans += Math.Log10(i); // multiply the // result with n ans = ans * n; return 1 + (int)Math.Floor(ans); } // Driver Code public static void Main () { int n = 4; Console.WriteLine( countDigits(n) + "\n"); } } // This code is contributed // by anuj_67.
PHP
<?php // PHP program to find count of // digits in N factorial raised to N function countDigits ($n) { // we take sum of logarithms as // explained in the approach $ans = 0; for ($i = 1; $i <= $n; $i++) $ans += log10($i); // multiply the result with n $ans = $ans * $n; return 1 + floor($ans); } // Driver Code $n = 4; echo countDigits($n) , "\n"; // This code is contributed // by jit_t ?>
Javascript
<script> // Javascript program to find count of digits in N // factorial raised to N function countDigits(n) { // we take sum of logarithms as explained // in the approach let ans = 0; for (let i = 1; i <= n; i++) ans += Math.log10(i); // multiply the result with n ans = ans * n; return 1 + Math.floor(ans); } let n = 4; document.write(countDigits(n) + "<br>"); // This code is contributed by Mayank Tyagi </script>
6
Publicación traducida automáticamente
Artículo escrito por jaideeppyne1997 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA