Principiante · Bucles + matemática entera
Contar dígitos
Lee un entero positivo e imprime cuántos dígitos tiene. Presenta el truco numérico más útil del nivel principiante: trocear dígitos con / 10 y % 10.
En una fraseCuenta las cifras de N dividiendo por 10 en un while hasta que N llegue a 0: la misma forma de bucle que reutilizan todos los problemas de dígitos.
El problema
Entrada: un entero positivo N (1 ≤ N ≤ 10⁹).
Salida: cuántos dígitos tiene N.
Ejemplos:
| Entrada | Salida |
|---|---|
12345 | 5 |
7 | 1 |
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 — el patrón de trocear
n % 10 da el último dígito; n / 10 lo elimina (¡división entera! mira por qué 7/2 es 3). Así 12345 pasa a 1234, luego 123… hasta llegar a 0. Cuenta cuántos cortes fueron.
Pista 2 — elegir el bucle
No sabes de antemano cuántas iteraciones harán falta — ese es trabajo del while: while (n > 0) { count++; n /= 10; }. Como en la guía de for vs while: número de vueltas desconocido → while.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int count = 0;
while (n > 0) {
count++;
n /= 10;
}
cout << count << endl;
return 0;
}
Este patrón de trocear es la mitad del siguiente problema también — Suma de los dígitos usa los mismos dos movimientos en otro orden. Así piensa un algoritmo: los patrones se recombinan.
Análisis profundo
Por qué funciona
Dividir entre 10 arranca el último dígito y el módulo 10 lo lee. Ese par / 10 y % 10 es toda la base de la manipulación de dígitos, y aparece en la mitad de los problemas del sitio.
El coste
O(d), con d = número de dígitos. Como mucho 10 para un int, así que en la práctica es constante.
Dónde falla
while (n > 0)devuelve 0 dígitos para n = 0. El cero necesita su propia respuesta.log10(n) + 1parece elegante y falla en 0 y en el redondeo de coma flotante en las potencias exactas de diez.
Siguiente paso
Suma los dígitos que vas arrancando: Suma de los dígitos.
Dos cosas para recordar
- / 10 quita el último dígito; % 10 lo lee.
- El cero es la entrada que rompe todo bucle de dígitos.
🐞 Esta versión falla: ábrela y pruébala
while (n >= 10) se para un dígito antes
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int count = 0;
while (n >= 10) {
n /= 10;
count++;
}
cout << count << endl;
return 0;
}