Número de dígitos en N factorial a la potencia N

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,  (N!)^N
Ejemplos: 
 

Input: 4
Output: 6
Explanations: (4!)^4 = (24)^4 = 331776. 
Total number of digits in 331776 is 6.
Input: 5
Output: 11
Explanations: (5!)^5 = (120)^5 = 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  (N!)^N   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  N * log10(N!).
  
y sabemos,  ¡NORTE!  = 1 * 2 * 3 * 4 *....* N.
por lo tanto, podemos reducir aún más. 
  
N * log10(N!)
  
= N * log10(1 * 2 * 3 * 4 *....* N)
  
= N * [log10 (1) + log10 (2) + log10 (3) + .... + log10 (N)]
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>
Producción: 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *