es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comprendiendo la lógica de la salida del generador de números primos.

Este código está destinado a mostrar números primos dentro de un rango dado:

def sqrt(n):
    return n ** 0.5

encontrar primos

def primes(minNum, maxNum):
    suma_primos = 0
    for i in range(minNum, maxNum):
        current_max = int(sqrt(i))
        for n in range(2, current_max + 1):
            if(i % n == 0):
                break
            else:
                suma_primos += i
                print(i)
                break
    print('\nSuma de todos los primos:', suma_primos)

primes(10, 20)

Sin embargo, obtengo una salida incorrecta:

11, 13, 15, 17, 19

¿Alguien sabe cómo aparece el 15? Puse declaraciones de impresión en el primer bloque de instrucciones if para verificar que el 15 sea detectado por la condición if (i% n == 0), y lo es, pero de alguna manera aún aparece en mi salida final y no puedo entender por qué.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la variable primes_sum se está incrementando e imprimiendo incluso cuando se encuentra un número compuesto en el bucle interno. En el ejemplo dado, 15 cumple la condición if(i%n == 0) para n=3, pero aún se agrega a primes_sum y se imprime, lo que hace que aparezca en la salida.

    Para solucionar esto, se deben ejecutar las instrucciones de incremento e impresión de primes_sum solo cuando un número pase completamente el bucle interno sin encontrar un factor, lo que asegura que es un número primo. Una forma de lograr esto es usar un bloque else para el bucle interno, así:

    def primes(minNum, maxNum):
        primes_sum = 0
        for i in range(minNum, maxNum):
            current_max = int(sqrt(i))
            for n in range(2, current_max + 1):
                if(i%n == 0):
                    break
            else:  # este bloque else solo se ejecuta si el bucle interno se completa sin encontrar un factor
                primes_sum += i
                print(i)
    
        print('\nSuma de todos los números primos: ', primes_sum)
    
    primes(10, 20)
    

    Salida:

    11
    13
    17
    19
    
    Suma de todos los números primos:  60
    

    Con esta modificación, el código identifica y muestra correctamente solo los números primos en el rango dado.

Comments are closed.