Ejercicio 05 — Pide N e imprime todos los primos entre 2 y N

Dificultad: amarillo · Módulo 03 (Bucles)

Enunciado

Pide N e imprime todos los primos entre 2 y N

Cómo se resuelve

Listar los primos hasta N combina dos bucles anidados con break y estrena una joya de Python: el else del for.

  1. for p in range(2, n + 1) — el bucle exterior recorre cada candidato p que podría ser primo.
  2. for d in range(2, int(p**0.5) + 1) — el bucle interior busca un divisor de p. Solo probamos hasta la raíz cuadrada (p**0.5) porque si p tiene un divisor mayor que su raíz, forzosamente tiene otro menor que ya habríamos encontrado; esto ahorra muchísimas vueltas.
  3. if p % d == 0: break — si d divide a p (resto cero), p no es primo y cortamos el bucle interior con break: no tiene sentido seguir buscando más divisores.
  4. else: colgado del for (no del if) — este else se ejecuta solo si el bucle interior terminó SIN toparse con un break, es decir, si no encontró ningún divisor. En ese caso p es primo y lo imprimimos.

El for ... else no existe en C; allí necesitarías una bandera (bool es_primo = true;) que pones a false al hallar un divisor y consultas después del bucle. Python te da esa lógica de “el bucle terminó limpio” de forma directa.

Trampa habitual: creer que el else va con el if. Fíjate en la indentación: está alineado con el for interior, y su regla es “si no hubo break”.

Para practicar — cópialo y complétalo

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

# Curso de Python — Modulo 03: Bucles
# Ejercicio 05 — PRACTICA (rellena los TODO)
# Enunciado: Pide N e imprime todos los primos entre 2 y N
# Dificultad: amarillo
# Ejecutar: python3 ej05_practica.py
 
# TODO 1: Lee N desde teclado y conviertelo a entero.
n = None  # reemplaza esto
 
# TODO 2: Bucle externo: recorre cada candidato p desde 2 hasta N inclusive.
for p in range(0):  # ajusta los argumentos
    # TODO 3: Bucle interno: recorre divisores d desde 2 hasta sqrt(p) inclusive.
    #         int(p**0.5) + 1 te da el limite superior correcto.
    for d in range(0):  # ajusta los argumentos
        # TODO 4: Si d divide a p exactamente (p % d == 0), sal del bucle interno.
        pass
 
    # TODO 5: Usa el bloque "else" del bucle interno.
    #         Ese else se ejecuta SOLO si el for termino sin break,
    #         es decir, ningun divisor fue encontrado => p es primo.
    #         Imprime p en ese caso.
    # else:
    #     pass

Solución — cópiala y ejecútala

# Curso de Python — Modulo 03: Bucles
# Ejercicio 05 — MODELO (resuelto)
# Enunciado: Pide N e imprime todos los primos entre 2 y N
# Dificultad: amarillo
# Ejecutar: python3 ej05_modelo.py
 
n = int(input("Hasta que numero buscar primos: "))
 
for p in range(2, n + 1):
    # Comprueba si algun numero entre 2 y sqrt(p) divide a p
    for d in range(2, int(p**0.5) + 1):
        if p % d == 0:
            break  # encontramos un divisor: p no es primo
    else:
        # El for termino sin break => ningun divisor => p es primo
        print(p)

Cómo usarlo

Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.

Conexiones