Hola, estoy haciendo una función que verifica si un número es primo o no, pero me dice que 9 es primo.
def eprimo(num): if num < 2: return False if num == 2: return True else: for div in range(2,num): if num % div == 0: return False else: return True
Volverá a partir de la primera iteración de ese bucle for si ha terminado de verificar o no. No debe regresar desde dentro del bucle a menos que el número definitivamente no sea primo. Retire el else
y solo devuelva True
si el bucle finaliza.
def eprimo(num): if num < 2: return False if num == 2: return True else: for div in range(2,num): if num % div == 0: return False return True
Nota de lado de optimización: Realmente no es necesario verificar todos los candidatos de divisor hasta el num
. Solo necesitas comprobar hasta la raíz cuadrada de num
.
Su bucle for
sale justo después de la primera iteración cuando verifica si su número es divisible entre 2. Si su número es par, devolverá False
; De lo contrario, devolverá True
.
La solución es no devolver la True
inmediatamente; esperar el final de todas las iteraciones en el bucle en su lugar:
for div in range(2, num): if num % div == 0: return False return True
Alternativamente, use la construcción all()
:
return all(num % div != 0 for div in range(2, num))
En lugar de probar todos los divisores en el rango (2, num), puede extraer la prueba para los números pares y luego hacer un bucle solo en los números impares. Además, como sugiere Bill the Lizard, puedes detenerte en la raíz cuadrada de num. Esto será el doble de rápido:
def eprimo(num): if num < 2: return False if num % 2 == 0: return num == 2 div = 3 while div * div <= num: if num % div == 0: return False div += 2 return True