Você está na página 1de 4

#001 - Paradigma do Nmero Primo

Objetivo: Explicar como montar um algoritmo que identifica se o nmero primo ou no; Foco: Iniciantes em Lgica de Programao. Linguagem: Java (Embora o que ser explicado seja independente de linguagem, usaremos a linguagem java para explicao). 1. O que um nmero Primo? Um nmero natural um nmero primo quando ele tem exatamente dois divisores: o nmero um e ele mesmo. Exemplos de nmeros primos: 2, 3, 5, 7, 11, 13, 17, ...; 2. Comeando o Algoritmo Visto que um nmero natural um nmero primo quando ele possui exatamente dois divisores: o nmero um e ele mesmo. Ento, podemos comear o algoritmo baseado nessa propriedade particular que a definio de nmeros primos. O que significa ser divisvel (apenas) por um e por ele mesmo? Significa que qualquer outro nmero no intervalo no o dividir de forma exata. Ou seja, na diviso euclidiana deixar resto diferente de zero. Vejamos um exemplo. #Exemplo01: Imaginemos que temos o nmero 5 e queremos saber se ele primo. Como faremos? Passo (01) - Dividir 5 por 2. Ao lado no rascunho voc pode verificar a diviso por 2 e ver que o resto deu 1. Ou seja, 5 no divisvel por 2. Passo (02) - Dividir 5 por 3. E olhando novamente no rascunho veremos que 5 no divisvel por 3. Visto que o resto da diviso diferente de zero. Passo (03) - Dividir 5 por 4. E fazendo esta diviso notaremos que 5 tambm no divisvel por 4. Resposta: 5 PRIMO. Pois divisvel apenas por 1 e por si prprio. Ento, o processo para saber se um nmero primo ou no apenas dividir os nmeros que esto dentro do intervalo aberto de 1 at o nmero desejado. No caso da diviso por 5 dividiremos 5 por 2, 3 e 4. Mas se quisermos saber se 7 primo dividiremos por 2, 3, 4, 5 e 6. Sugesto: Caso no tenha compreendido, minha sugesto pegar alguns exemplos pequenos como 5, 7, 11 e 13 e faz-los em um papel para melhor visualizao. 3. O Primeiro Cdigo Com esse conhecimento que temos j podemos desenvolver um cdigo simples que funcione. Mais na frente implementaremos o cdigo abaixo para uma forma mais sofisticada de verificar se o nmero primo ou no.
1. import java.util.*; 2. 3. public class NumPrimo { public static void main(String[] args) { 4. Scanner in = new Scanner (System.in); 5. 6. /* 7.

Rascunhos
Passo (01) Passo (02)

5 2 -4 2 (1)

5 3 - 3 1 (2)

Paradigma do Nmero Primo | 1

8. * Declarando 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31; 32. 33. 34. 35. 36. 37. 38. } 39. }

as variveis. */ int numero, divisor, resto, i = 0; //Contador inicializado em zero. System.out.println("Digite um nmero: "); numero = in.nextInt(); //Leitura de varivel nmero. divisor = 2; //Inicializaremos a varivel com 2, umas vez que por 1 todos os nmeros j sero divisveis. while (divisor < numero) { //Enquanto o divisor for menor que o nmero. Faa: resto = numero%divisor;//Diviso (mod) - Diviso que acha o resto. if (resto == 0) { //Se o resto for igual a zero ento some 1 ao contador. i = i + 1; } divisor = divisor + 1; // somado 1 ao divisor que no inicio 2. } //A lao termina quando o divisor j no for menor que o nmero. if (i > 0) { System.out.println("NO PRIMO."); } else { System.out.println(" PRIMO."); }

#Explicando melhor o cdigo (Caso no tenha entendido). 1. Declaramos as variveis: a. numero: Nmero inserido pelo usurio. b. divisor: Inicializada em 2 o nmero que ir dividir a varivel numero. c. resto: o resto da diviso da varivel numero pela varivel divisor. 2. While (divisor < numero) Enquanto a varivel divisor for menor que a varivel numero ele continuar no lao de repetio. Por exemplo: Digamos que numero seja igual a 7. Ento acontecer o seguinte: Uma vez que divisor igual a 2 e numero igual a 7, ento o programa entrar no lao. E a cada loop o divisor ser acrescido de 1. O programa ficar no loop at divisor igual a 7, quando j no menor e sim igual a numero. 3. resto = numero%divisor (%) o operador usado em java para pegar o resto da diviso. Assim como tambm em php. equivalente ao (mod) em pascal. Exemplo: numero = 7; divisor = 2; resto = numero%divisor = 7%2 = 1; 4. if (resto == 0) Como vimos anteriormente um nmero divisvel por outro quando o resto da diviso for igual a zero. Por tal motivo ele est dentro do lao. Ele ser verificado a cada loop e em caso do resto ser igual a zero a varivel contadora i recebe + 1. E assim mais na frente poderemos saber se houve algum momento em que o resto for igual a zero, havendo o nmero no Primo.
Paradigma do Nmero Primo | 2

4. Melhorando o Cdigo um cdigo bom o que usamos anteriormente. Porm h formas mais eficazes para resolver o paradigma dos nmeros primos. E tal cdigo veremos a seguir. J adiantando... usaremos uma varivel boolean e ao invs do divisor ir at o nmero digitado pelo usurio. Ir at a metade. Quer saber porque? Continue lendo ou pesquise para descobrir. 4.1. Melhorias PARTE 1 (METADE) Agora usaremos um pouco de lgica para melhorar o nosso cdigo e forma de verificao. Anteriormente foi dito que s era preciso o divisor crescer at a metade do nmero e no at ele. #Porque? Porque nenhum nmero tem um divisor acima da sua metade a no ser ele mesmo. #Porque bom usar tal raciocnio no cdigo? Porque o computador far menos processamentos. Tomemos como exemplo o nmero 40. Pelo nosso cdigo atual divisor iria de 2 at 40 (ainda so poucas). Agora supondo que o usurio atribua o valor 900 a varivel numero. Ento pra evitar um nmero de processamentos desnecessrios e ter um programa mais rpido usamos a lgica citada acima e nosso cdigo fica da seguinte forma:
18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. metade = numero/2; while (divisor < (metade)) { //S preciso ir at a metade do numero. resto = numero%divisor; //Diviso (mod) - Diviso que acha o resto. if (resto == 0) { i = i + 1; } divisor = divisor + 1; }

4.2. Continuando com as Melhorias Parte 2 Mesmo com o cdigo novo ainda so feitas muitas verificaes que no so necessrias. Quer ver um exemplo? Sendo numero igual a 15 a varivel divisor ir at 7. E nosso contador? Ir at quanto? i terminar o programa igual a 2. Pois haver dois divisores do nmero 15 (no intervalo aberto entre 1 e 15). Ou seja, h uma contagem desnecessria, pois achamos dois divisores alm de 1 e 15 quando s precisamos achar um e estar provado que o nmero no primo. A partir do momento que acharmos uma varivel divisor que divida numero e deixe resto igual a zero j podemos parar o programa e dizer: No PRIMO! A questo : Como fazemos isso? Resposta: Usando uma varivel do tipo boolean. #Implementando a varivel do tipo boolean no cdigo.
18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. metade = numero/2; boolean achouPrimo = true; while (divisor < (metade) && achouPrimo == true) { //Enquanto divisor for menor que a metade e achou Primo = true o programa ficar no lao. resto = numero%divisor; //Diviso (mod) - Diviso que acha o resto. if (resto == 0) { achouPrimo = false; //Se o resto = 0. achouPrimo recebe FALSO. Pois o nmero no ser Primo. } divisor = divisor + 1; } if (achouPrimo == false) { System.out.println("NO PRIMO."); } else { System.out.println(" PRIMO."); } Paradigma do Nmero Primo | 3

#O que conseguimos com a Segunda melhoria? O que fizemos no cdigo citado acima foi o seguinte: Definimos uma varivel lgica achouPrimo que a principio tomada como verdadeira. E ao entrar no lao sua veracidade testada. Caso o programa receba resto = 0 ele setar achouPrimo = false. Uma vez que achamos um divisor no intervalo aberto entre 1 e numero. E caso no seja achado nenhum resto igual a zero, ento a varivel achouPrimo continuar sendo verdadeira e de fato o nmero ser primo. 4.3. Mais melhorias Se formos citar melhorias e mais melhorias no cdigo o tutorial ficar sobremodo extenso, ento iremos encerrar por aqui. Mas fica a dica, no precisamos ir at a metade. Podemos ir apenas at a raiz de um nmero. 5. O cdigo final Confira abaixo o cdigo completo em java do algoritmo do nmero primo.

import java.util.*; public class NumPrimo { public static void main(String[] args) { Scanner in = new Scanner (System.in); /* * Declarando as variveis. */ int numero, divisor, resto; boolean achouPrimo = true; //Definimos ela como verdade. Pois a varivel precisa ser inicializada nesse caso. System.out.println("Digite um nmero: "); numero = in.nextInt(); //Leitura de varivel nmero. divisor = 2; // Inicializaremos a varivel com 2, umas vez que por 1 todos os nmeros j sero divisveis. int metade = numero/2; while (divisor < numero && achouPrimo == true) { resto = numero%divisor; //Diviso (mod) - Diviso que acha o resto. if (resto == 0) { achouPrimo = false; //A varivel achouPrimo s ser alterada para false SE o resto igual a ZERO. Caso contrrio continuar verdadeira. } divisor = divisor + 1; }

if (achouPrimo == false) { System.out.println("NO PRIMO."); } else { System.out.println(" PRIMO."); } } }

Paradigma do Nmero Primo | 4

Você também pode gostar