Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

capoia

[Duvida] Identificar números primos

Recommended Posts

Boa tarde, estou aqui novamente pedindo uma ajuda, não quero que vocês pensem que quero que faça minhas tarefas ou algo do tipo é só porque não consegui encontrar mesmo , meu professor de algoritmo passou pra acharmos os números primos de 1 a 500 .. eu sei que para achar o numero primo ele tem que ser divisível por 1 e por ele mesmo ... e somente por essas duas opções.

eu achei o seguinte algoritmo pesquisando pela net :

Var
// Seção de Declarações das variáveis
n, cn, i, dv: inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc...
para i de 1 ate 500 faca
cn <- 0
para dv de 1 ate i faca
se (i % dv = 0) entao
cn <- cn + 1
fimse
fimpara
se cn = 2 entao
escreval ("Primo: ", i, " ")
fimse
fimpara
Fimalgoritmo

e ele realmente funciona .. só que eu não consigo entender o código , porque ai ele verifica o mod para ver se é 0 e ai conclui que é divisível pelo próprio numero e por 1 , entendi , porem como garante que não é divisível por outros números? alguém pode por favor me explicar?
desde já agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem dois laços (instrução para).

 

O de dentro, verifica se i % dv = 0.

 

Certo.

 

dv, inicia em 1, ou seja, todos os números são divisiveis por 1, logo cn incrementa +1.

Isso vai até o número i. Chega uma hora que i é igual a dv, e também incrementa 1 em cn.

 

Se cn = 2, ou seja, se i for divisivel por 1 e i, então o número é primo.

 

Fui claro? Me parece confuso minha explicação kkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

na hora de verificar o cn é ai que diz se é primo ou não... pois se o numero for primo de todos os mods que ele tirou só vai ter 2 divisões de mod = 0 caso contrário não é primo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem dois laços (instrução para).

 

O de dentro, verifica se i % dv = 0.

 

Certo.

 

dv, inicia em 1, ou seja, todos os números são divisiveis por 1, logo cn incrementa +1.

Isso vai até o número i. Chega uma hora que i é igual a dv, e também incrementa 1 em cn.

 

Se cn = 2, ou seja, se i for divisivel por 1 e i, então o número é primo.

 

Fui claro? Me parece confuso minha explicação kkk

 

na hora de verificar o cn é ai que diz se é primo ou não... pois se o numero for primo de todos os mods que ele tirou só vai ter 2 divisões de mod = 0 caso contrário não é primo

 

Tive que ler algumas vezes kk mas acho que entendi ....

então ali no caso o CN vai contar quantas vezes foi divisível né? ( quantas vezes o mod deu zero ) e se for 2 ele exibe esse numero , correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive que ler algumas vezes kk mas acho que entendi ....

então ali no caso o CN vai contar quantas vezes foi divisível né? ( quantas vezes o mod deu zero ) e se for 2 ele exibe esse numero , correto?

 

Exato.

 

Exemplo: i = 4;

4 % 1 = 0 cn+1

4 % 2 = 0 cn+1

4 % 3 = 1

4 % 4 = 0 cn+1

cn vale 3, logo não é primo.

 

i = 7;

7 % 1 = 0 cn+1

7 % 2 = 1

7 % 3 = 1

7 % 4 = 3

7 % 5 = 2

7 % 6 = 1

7 % 7 = 0 cn+1

cn vale 2, logo é primo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, você entendeu, mas parece estar com conceitos vagos, ainda. Antes de tudo, recomendo utilizar o VisuAlg para testar algoritmos, linha por linha.

Era importante o autor do código ter criado uma legenda para as variáveis, porque estas não são tão intuitivas para um iniciante, portanto, segue legendas criadas por mim:

 

cn: Contador de números

 

  • Esta se caracteriza por ser inteira e armazenar quantos divisores um número teve por repetição (iteração).

 

i: Índice

 

  • Assim como um índice de um livro, este indica qual o número da repetição (iteração), do primeiro laço.

 

dv: Divisor

 

  • Da mesma forma de "i", este também é um índice. Esta variável indica qual número será o divisor de "i".

Outro problema recorrente (impedindo compreensão) é a falta de indentação. Confira o código e perceba como é mais fácil diferir os laços, que estão dentro de si mesmos:

Var
// Seção de Declarações das variáveis
n, cn, i, dv: inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc...

para i de 1 ate 500 faca //Este é o primeiro laço e funciona para definir o dividendo
    cn <- 0 //O contador de número precisa ser "zerado", quando uma repetição começa, porque o dividendo muda.
    para dv de 1 ate i faca //Este é o segundo laço e conta os divisores de 1 ate o dividendo i
        se (i % dv = 0) entao //Se a divisão entre o dividendo "i" e o divisor "dv" tiver resto 0:
          cn <- cn + 1 //Contador de números recebe +1
        fimse
    fimpara
    se cn = 2 entao //Se o contador de números obtiver somente 2 incrementos: 
      escreval ("Primo: ", i, " ") //então o dividendo i é mostrado, sendo primo.
    fimse
fimpara
Fimalgoritmo

O código acima foi indentado e comentado, ato necessário para terceiros (como você) entender o algoritmo.

Lembre-se: A variável "i" só é incrementada quando o segundo laço faz todas repetições.

 

Atualização: Uma instrução não obrigatória (mas que melhora a performance) é criar uma condição que encerra o segunda laço, ASSIM que for detectado mais de 2 divisores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, você entendeu, mas parece estar com conceitos vagos, ainda. Antes de tudo, recomendo utilizar o VisuAlg para testar algoritmos, linha por linha.

 

Era importante o autor do código ter criado uma legenda para as variáveis, porque estas não são tão intuitivas para um iniciante, portanto, segue legendas criadas por mim:

 

cn: Contador de números

 

  • Esta se caracteriza por ser inteira e armazenar quantos divisores um número teve por repetição (iteração).

 

i: Índice

 

  • Assim como um índice de um livro, este indica qual o número da repetição (iteração), do primeiro laço.

 

dv: Divisor

 

  • Da mesma forma de "i", este também é um índice. Esta variável indica qual número será o divisor de "i".

Outro problema recorrente (impedindo compreensão) é a falta de indentação. Confira o código e perceba como é mais fácil diferir os laços, que estão dentro de si mesmos:

Var
// Seção de Declarações das variáveis
n, cn, i, dv: inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc...

para i de 1 ate 500 faca //Este é o primeiro laço e funciona para definir o dividendo
    cn <- 0 //O contador de número precisa ser "zerado", quando uma repetição começa, porque o dividendo muda.
    para dv de 1 ate i faca //Este é o segundo laço e conta os divisores de 1 ate o dividendo i
        se (i % dv = 0) entao //Se a divisão entre o dividendo "i" e o divisor "dv" tiver resto 0:
          cn <- cn + 1 //Contador de números recebe +1
        fimse
    fimpara
    se cn = 2 entao //Se o contador de números obtiver somente 2 incrementos: 
      escreval ("Primo: ", i, " ") //então o dividendo i é mostrado, sendo primo.
    fimse
fimpara
Fimalgoritmo

O código acima foi indentado e comentado, ato necessário para terceiros (como você) entender o algoritmo.

Lembre-se: A variável "i" só é incrementada quando o segundo laço faz todas repetições.

 

Atualização: Uma instrução não obrigatória (mas que melhora a performance) é criar uma condição que encerra o segunda laço, ASSIM que for detectado mais de 2 divisores.

Ual , muito obrigado , mais claro que isso impossível , obrigado mesmo pela ajuda, me deu uma aula agora :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.