Medio–difícil · el truco es aritmético

Ceros finales

La entrada es demasiado grande para calcularla. No es un defecto del problema: es el problema diciéndote que la respuesta no está en el cálculo.

En una fraseLos ceros finales vienen de los factores 5, así que la respuesta es n/5 + n/25 + n/125 + …: nunca calcules n!, que para n hasta 10⁹ es astronómico.

El problema

Entrada: Un entero n (1 ≤ n ≤ 1,000,000,000).

Salida: Cuántos ceros finales tiene n!, donde n! = 1 × 2 × … × n.

Ejemplos:

EntradaSalida
51
102
256

10! = 3628800 → dos ceros. 25! = 15511210043330985984000000 → seis. Ojo: 25/5 solo da 5; el sexto cero viene de que 25 aporta dos factores de 5.

Tu solución

main.cpp — tu solución
Entrada personalizada para «Ejecutar mi entrada»

La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.

¿Atascado? Pistas

Pista 1 — Un cero final es un factor de 10

Cada cero final significa que el número es divisible por otro 10, y 10 = 2 × 5. Así que la pregunta pasa a ser: ¿cuántos pares (2, 5) hay escondidos en n!? Como los pares abundan mucho más que los múltiplos de 5, el número de 5 es el limitante: basta con contar los 5.

Pista 2 — No es n/5, esa es la trampa

n / 5 cuenta los múltiplos de 5, pero 25 aporta dos 5, 125 aporta tres, etc. Suma n / 25, luego n / 125, y sigue. El bucle queda precioso: while (n > 0) { n /= 5; zeros += n; }, dividiendo n mismo y acumulando.

Pista 3 — Por qué no debes recorrer de 1 a n

Multiplicar 1 × 2 × … × 1,000,000,000 son 109 iteraciones, y el número desbordaría cualquier tipo entero mucho antes. Aunque cupiera, la pestaña se congelaría. Cuando el rango de entrada hace imposible la fuerza bruta, eso es una pista: la solución buscada es O(log n) u O(1).

Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    long long zeros = 0;
    while (n > 0) {
        n = n / 5;
        zeros = zeros + n;
    }
    cout << zeros << endl;
    return 0;
}

Es el último problema de la cadena, y encaja: sin arrays, sin recorrer la entrada, sin recursión, solo una observación que cambia mil millones de multiplicaciones por una docena de divisiones. Esa es la diferencia entre alguien que sabe programar y alguien que escribe código: el segundo ve que la pregunta nunca fue sobre el factorial. Vuelve a la lista y mira cuántos puedes hacer ya sin pistas.

Análisis profundo

Por qué funciona

Cada cero final es un factor de 10, y 10 = 2 × 5. Los pares abundan mucho más que los múltiplos de 5, así que los 5 son el limitante: cuenta esos.

El coste

O(log_5 n): doce divisiones para mil millones. Multiplicar de 1 a n serían 10^9 multiplicaciones, y el número desbordaría mucho antes.

Dónde falla

  • Calcular solo n / 5 se pierde el 5 extra que aporta 25 y los dos que aporta 125: ya falla en n = 25.
  • Intentar calcular n! de verdad: con mil millones desborda cualquier tipo entero y congela la pestaña. Un rango de entrada que descarta la fuerza bruta <em>es</em> la pista.

Siguiente paso

Aquí termina la cadena. Mira el primer problema y fíjate en lo lejos que has llegado.

Dos cosas para recordar

  • Ceros finales = pares de 2×5, y el 5 es el lado escaso.
  • n / 5 no basta: también n / 25, n / 125…
🐞 Esta versión falla: ábrela y pruébala

Solo n / 5: se pierden los 5 extra de 25, 125, 625…

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    long long zeros = n / 5;
    cout << zeros << endl;
    return 0;
}