3
respostas

Verificar quais numeros são primos dentro de um vetor (python)

Olá, eu engasguei nessa atividade. b) Módulo que recebe como parâmetro um vetor de números inteiros e retorna a quantidade de números primos no vetor. Este módulo deve chamar a função IsPrime da próxima pergunta. c) Um módulo que recebe um número inteiro positivo como parâmetro e retorna verdadeiro se o número for primo ou falso se o número não for primo. O método NumberOfPrimes deve chamar o método IsPrime.

Eu estou lendo o vetor assim:

vetor = []
valor = int(input('Digite o tamanho do vetor: '))

while len(vetor) < valor:
    vetor.append(int(input('Digite um numero: ')))

print('=' * 50)
print("Seu vetor é: {0}".format(vetor))
print('=' * 50)

Mas quando preciso passar por cada elemento do vetor, e fazer uma verificação e contar se é primo, sai errado.

c = 0
qntPrimo = 0

for elemento in vetor:
    for divisor in range(1, elemento +1):
        if elemento % divisor == 0:
            c = c + 1
    if c == 2:
        qntPrimo += 1
        print(qntPrimo)

Pode me ajudar?

3 respostas

Olá Jenifer, tudo bem?

Primeiramente queria te parabenizar pela dedicação, sua lógica no programa está correta! Faltou só um pequeno detalhe que passou despercebido. Veja comigo, essa variável "c", que foi criada, ela é acrescida de 1 quando entra naquele if elemento % divisor == 0:, mas o valor dela nunca é zerada novamente, e ai está acontecendo algo curioso. Como o valor de "c" nunca é zerado, ele sempre é acrescido de 1 quando entra no if, então ele pode ter valor 3, 4, 5... e ai ele só vai entrar no if c == 2: uma unica vez, caso o primeiro numero da lista seja primo, ou nenhuma caso contrário. Para resolver isso basta colocar o c = 0 no começo do primeiro for. Veja abaixo como ficaria essa mudança:

qntPrimo = 0

for elemento in vetor:
    c = 0
    for divisor in range(1, elemento +1):
        if elemento % divisor == 0:
            c = c + 1
    if c == 2:
        qntPrimo += 1
        print(elemento)

Espero ter ajudado! Qualquer coisa é só falar ;)

Bons estudos!

Olá bom dia,

Obrigada pela ajuda. Alguém já tinha comentado comigo isso de zerar o C, mas não entendi.

Bom dia!

É porque se não zerar o valor de C você nunca vai conseguir achar mais do que 1 número primo na lista. Vou tentar ilustrar uma situação. Imagina que temos esse vetor de números para achar os primos:

vetor = [2,  3,  4, 10]

Nós sabemos que tem 2 números primos ali, que são o 2 e 3. No começo C = 0, depois de fazer o primeiro for divisor in range(1, elemento +1):, o valor de C = 2, porque ele vai entrar no if elemento % divisor == 0: duas vezes e depois será adicionado +1 no qntPrimo. Mas como não foi zerado o valor C, ele continua sendo C = 2. No próximo for divisor in range(1, elemento +1): ele novamente vai entrar duas vezes no if elemento % divisor == 0:, mas como C já tinha o valor 2, agora ele vai ter o valor 4, porque fez c = c + 1 mais duas vezes. Só que como agora C é diferente de 2, ele não vai entrar no if c == 2: e não vai fazer qntPrimo += 1, e por ai vai... A cada número do vetor que for verificado se é primo ou não, o valor de C ficará sendo:

Para o numero 2 do vetor    -> C = 2
Para o numero 3 do vetor    -> C = 4
Para o numero 4 do vetor    -> C = 7
Para o numero 10 do vetor   -> C = 11

No fim, o resultado do número de primos no vetor não estará correto. Por isso zeramos o valor de C, para que novamente ele possa valer C = 2 para entrar no if c == 2: e fazer qntPrimo += 1.

Agora zerando a variável C, para cada número do vetor que for verificado se é primo ou não, o valor de C ficará sendo:

Para o numero 2 do vetor    -> C = 2
Para o numero 3 do vetor    -> C = 2
Para o numero 4 do vetor    -> C = 3
Para o numero 10 do vetor   -> C = 4

E como apenas o número 2 e 3 tem o C = 2, quer dizer que são os únicos primos no vetor, por terem apenas dois divisores.

Ficou um pouco mais claro agora? Se não ficou, pode falar que eu tento explicar novamente!