Si listamos todos los números naturales menores que 10 que son múltiplos de 3 o 5, obtenemos 3, 5, 6 y 9. La suma de estos múltiplos es 23.
Encuentra la suma de todos los múltiplos de 3 o 5 menores que 1000.
Entendiendo el problema
Antes de escribir código, resolvamos el caso pequeño del enunciado para verificar que entendemos qué nos piden.
Múltiplos de 3 menores que 10
3, 6, 9 — Son divisibles por 3 sin dejar resto
Múltiplos de 5 menores que 10
5 — El 10 no cuenta porque no es menor que 10
Unión sin repetir
3, 5, 6, 9 — Ninguno se repite en este caso
Suma
3 + 5 + 6 + 9 = 23 — Coincide con el enunciado
¿Por qué necesitamos código?
Hay 466 números que cumplen la condición entre 1 y 999. Sumarlos manualmente sería tedioso y propenso a errores.
Conceptos clave
La estrategia
Recorrer todos los números del 0 al 999, comprobar si cada uno es múltiplo de 3 o de 5, y si lo es, sumarlo a un acumulador.
Importante: No hay una única forma "correcta" de escribir esto. Aquí verás tres variantes que hacen exactamente lo mismo. Elige la que te resulte más clara.
Variante A: while True + break
Un bucle infinito que rompemos manualmente cuando llegamos al límite. Muy explícita, ideal cuando la condición de salida es compleja.
Variante B: while con condición
La condición de salida va directamente en el while. Más limpio, sin break. Útil cuando no sabes cuántas vueltas darás.
Variante C: for con range
Python gestiona el contador automáticamente. Menos código, menos posibilidad de errores. La más común cuando conoces el rango exacto.
¿Cuál elegir?
| Variante | Líneas | Ventaja | Cuándo usarla |
|---|---|---|---|
| A: while True + break | 11 | Muy explícita | Condición de salida compleja |
| B: while con condición | 7 | Clara y compacta | No sabes cuántas vueltas darás |
| C: for con range | 5 | Menos errores | Conoces el rango exacto |
Las tres dan el mismo resultado. La variante C es la más común en Python para este tipo de problemas.
Conceptos clave
suma = 0
Variable acumuladora. Aquí guardamos la suma parcial. Es como una hoja donde apuntamos el resultado mientras trabajamos.
while vs for
Bucles. Ambos repiten código. while repite mientras una condición sea verdadera. for recorre una secuencia predefinida.
range(1000)
Generador de secuencia. Produce los números 0, 1, 2... 999. No incluye el 1000. Nos ahorra gestionar el contador manualmente.
i % 3 == 0
Operador módulo. El % devuelve el resto de la división. Si el resto es 0, significa que i es divisible por 3.
or
Operador lógico. Basta con que se cumpla UNA de las dos condiciones. Si es múltiplo de 3, entra. Si es de 5, también.
suma = suma + i
Acumulación. Tomamos el valor actual de suma, le añadimos i, y guardamos el nuevo valor. También se puede escribir suma += i.
break
Salida de bucle. Termina el bucle inmediatamente. Útil cuando la condición de salida es compleja o está en medio del código.
Conceptos de Python aprendidos
Expresividad de Python
Python permite expresar la misma lógica de forma más compacta usando generadores y funciones integradas.
Desglose
range(1000)
Genera 0, 1, 2... 999 bajo demanda (lazy evaluation).
i for i in range(1000) if ...
Expresión generadora: produce solo los valores que pasan el filtro.
sum(...)
Función integrada que suma todos los elementos de un iterable.
| Aspecto | Fuerza bruta | Pythónico |
|---|---|---|
| Iteración | for explícito |
range() |
| Filtrado | if con bloque |
if en generador |
| Acumulación | suma += i |
sum() |
| Líneas | 5 | 1 |
Solución O(1)
Las soluciones anteriores recorren todos los números. Existe una fórmula que da el resultado directamente, sin importar si el límite es 1000 o 1.000.000.000.000.
Aplicación a múltiplos
Los múltiplos de 3 menores que 1000 son: 3, 6, 9... 999 = 3×1, 3×2, 3×3... 3×333
Inclusión-exclusión
Si sumamos múltiplos de 3 y de 5 por separado, contamos dos veces los múltiplos de 15. Hay que restarlos una vez.
Comparativa de rendimiento
| Método | Límite 1.000 | Límite 10⁹ | Complejidad |
|---|---|---|---|
| Fuerza bruta | ~1.000 ops | ~10⁹ ops | O(n) |
| Pythónico | ~1.000 ops | ~10⁹ ops | O(n) |
| Matemático | 3 ops | 3 ops | O(1) |