sexta-feira, 10 de março de 2017

Algoritmo Numero Primo (Visualg)

Na lista de exercícios da disciplina de algoritmo tem a seguinte questão:
Fazer um programa que leia um numero digitado pelo usuário e exibir uma mensagem informando se o numero digitado é primo ou não.
Bem, números primos são aqueles que são divisíveis somente por ele mesmo e por um, a partir dessa afirmação já podemos formular algumas perguntas para montar a lógica da questão: Como saber se um numero é divisível por ele mesmo e por um? Como saber se ele não divisível pelos demais números? Uma das formas de se responder a essas perguntas seria pegar esse numero e dividi-lo por ele mesmo e depois por todos os números antecessores a ele até chegar a um (ou começar do um até chegar ao numero). Dessa forma podemos ver todos os divisores desse numero (aqueles números os quais a divisão não deixa resto) e depois contá los, como o numero primo só tem como divisor ele mesmo e um, então se o numero tiver somente dois divisores ele é primo, se tiver mais de dois, não é primo. No visualg ficou assim:

algoritmo "NumerosPrimos"
// Função : Verificar se um numero é primo ou não.
// Autor : Eliel
// Data : 09/03/2017
// Seção de Declarações
var
numero, i, cont :inteiro
inicio
escreval("digite um numero: ")
leia(numero)

para i de 1 ate numero faca
     se numero mod  i = 0 entao
        cont <- cont+1
     fimse
     i <- i+1
fimpara

se cont = 2 entao
   escreval("o numero", numero," e primo!")
senao
   escreval("o numero", numero," NAO e primo!")
fimse
fimalgoritmo

Nesse algoritmo foi usada a variável 'i' para representar os números antecessores do numero digitado e a variavel 'cont' para contar o numero de divisores do numero digitado. Esse algoritmo pode ser melhorado, de forma que mostre quais são os divisores do numero digitado:

algoritmo "NumerosPrimos"
// Função : Verificar se um numero é primo ou não.
// Autor : Eliel
// Data : 09/03/2017
// Seção de Declarações
var
numero, i, cont :inteiro
inicio
escreval("digite um numero: ")
leia(numero)

escreval("os divisores do numero ",numero," sao: ") // apresentar os divisores

para i de 1 ate numero faca
     se numero mod i = 0 entao
        escreva(" ",i)            // exibir na tela os divisores
        cont <- cont+1
     fimse
     i <- i+1
fimpara

escreval()   // pular
se cont = 2 entao
   escreval("o numero", numero," e primo!")
senao
   escreval("o numero", numero," NAO e primo!")
fimse
fimalgoritmo

Esse algoritmo roda bem com números não muito grandes, porém se o usuário digitar, por exemplo, 12000 ou um numero maior o visualg já demora um pouco para executar, isso por que no loop (comando para) vai ser executado um numero maior de passos, um custo maior de processamento. Então um possível solução seria diminuir o numero de antecessores, pois se o usuário digitar 12000, será feita 12000 divisões, mas dentro do intervalo de 1 a 10 podemos dividir todos o números "grande" por todos os números do intervalo para encontrar alguns divisores, mas se for encontrado apenas um divisor, o numero 1, então esse numero "grande" é um numero primo, mas isso é só um "jeitinho" que funcionou com alguns números:

algoritmo "NumerosPrimos"
// Função : Verificar se um numero é primo ou não.
// Autor : Eliel
// Data : 09/03/2017
// Seção de Declarações
var
numero, i, cont :inteiro
inicio
escreval("digite um numero: ")
leia(numero)
se numero = 1 entao
   escreval("o numero ",numero," NAO e primo!")
senao
    escreval("os divisores do numero ",numero," sao: ")
    se numero <= 10 entao  // se o numero for ate 10 divide pelos antecessores:
       para i de 1 ate numero faca
          se numero mod i = 0 entao
             escreva(" ",i)
             cont <- cont+1
          fimse
          i <- i+1
       fimpara
    senao      // sefor maior que 10 divide pelos antecessores de 1 a 10:
       para i de 1 ate 10 faca
          se numero mod i = 0 entao
             escreva(" ",i)   // só deve achar um divisor: o numero 1
             cont <- cont+1    // cont vai ter valor 1
          fimse
          i <- i+1
       fimpara
       cont <- cont+1    // aumentar para poder exibir a mensagem
       escreva(numero)   // para exibir o próprio numero depois do 1
    fimse
    escreval()      // pula um linha

    se cont = 2 entao
       escreval("o numero", numero," e primo!")
    senao
       escreval("o numero", numero," NAO e primo!")
    fimse
fimse
fimalgoritmo

14 comentários:

  1. gostei muito,,,,,,estava mesmo sem ideia

    ResponderExcluir
  2. Não precisa de um contador. Divide de 2 até "numero-1". Se der qualquer divisão com resto zero, sobe uma flag e interrompe o loop.

    ResponderExcluir
    Respostas
    1. Bom dia. Pensei assim também, mas como sou iniciante nem imagino como subir essa flag.

      Fazer o loop olhar para dentro da variável resultadoMod e se encontrar um zero, então parar o loop.

      Excluir
  3. É possível fazer um código que mostre todos os números primos entre 1 e n ?

    ResponderExcluir
    Respostas
    1. Algoritmo "Algoritmo para numero primo
      "
      // Disciplina : [Linguagem e Lógica de Programação]
      // Professor :
      // Descrição : Aqui você descreve o que o programa faz! (função)
      // Autor(a) : Nome do(a) aluno(a) Charlestom Macre
      // Data atual : 23/10/2021
      Var
      a,b,c,i,n1,n2,p:inteiro


      Inicio
      escreval ("- Programa para indentificar números primos.")
      escreval ()
      escreva("Digite o primeiro valor: ")
      leia (n1)
      escreva("Digite o segundo valor: ")
      leia (n2)
      se (n1 > n2) entao
      a <- (n2)
      b <- (n1)
      senao
      a <- (n1)
      b <- (n2)
      fimse
      escreval ()
      escreval ("Os valores primos entre ",a," e",b," são: ")
      para c de a ate b faca
      p <- 0
      para i de 1 ate c faca
      se (c mod i =0)entao
      p <- p+1
      fimse
      fimpara
      se (p=2) entao

      escreva (c)
      fimse
      fimpara
      escreval()
      escreval ("______________________________________")
      Fimalgoritmo

      Excluir