Olá a todos da comunidade, estou cursando Sistemas de informação 2 período e um professor passou uma atividade em Java para se achar números primos.
Quebrei a cabeça para fazer, tinha dado alguns erros ai fui procurar a solução an net. Mas vi que os cara usavam uma solução muito grande com uns códigos que ninquém entendi. Ai fiz de uma forma que não vi até agora em lugar algum e estou postando aqui, espero ajudar quem precise.
publicstaticvoidmain(String[]args){intop,contadorPrimo=0,contadorDig=0;//Variaveis do{//Inicio DO-WHILE para controlar quando deseja parar o programa;op=Integer.parseInt(JOptionPane.showInputDialog("Numeros digitados: "+contadorDig+"\nNumeros primos digitados: "+contadorPrimo+"\nEntre com número:"));contadorDig++;// CONTADOR de quantos números foram digitados;ai=op;if(op%3!=0&&op%2==1||op==2||op==3){// Inicio IF para adicionar contador de PRIMOS;contadorPrimo++;}//Fim IF adionar contador de PRIMOS}while(op!=0);//Fim DO-WHILE para programa fechar quando digitar 0;}}
Essa implementação está equivocada.
Você está considerando como primo todos os números divisíveis por 3 e não divisíveis por 2.
Existem várias técnicas de otimizar o algoritmo para verificar se um número é primo, a mais comum é contar os divisores até chegar a raíz quadrada do número testado.
Abaixo tem uma implementação otimizada que certa vez eu submeti no URI Online Judge
Não entendi amigo, pelo que sei de primo usando essa sintaxa dentro do IF funciona perfeitamente. Já testei com várias cadeias de números primso sem erro algum. E o exemplo que tu mandou no site está errado, pois, 3 é primo e 123 não é. Gostaria que em explicasse melhor.
rmendes081 like
Colega, está errado o seu código. Pelo seu código, qualquer número não-primo que não tenha fator 2 ou 3 vai ser contabilizado como número primo, exemplo: 35, 55, 77, etc.
staroski1 like
Ué, mas o meu algoritmo diz exatamente isso: que 3 é primo e 123 não é.
Tem certeza de que executou o código corretamente?
Execute o exemplo abaixo:
publicclassExercicioPrimos{publicstaticvoidmain(String[]args){ExercicioPrimosprograma=newExercicioPrimos();programa.executar();}privatevoidexecutar(){for(intnumero=0;numero<150;numero++){StringrespostaStaroski=algoritmo_do_staroski(numero)// algoritmo do staroski diz que é primo??"staroski"// então apresenta nome do staroski:" ";// senão apresenta vazioStringrespostaRenan=algoritmo_do_renan(numero)// algoritmo do renan diz que é primo??"renan"// então apresenta nome do renan:" ";// senão apresenta vazio// apresenta resultadoSystem.out.printf("quem diz que %03d é primo? %s %s\n",numero,respostaStaroski,respostaRenan);}}privatestaticbooleanalgoritmo_do_renan(intop){if(op%3!=0&&op%2==1||op==2||op==3){returntrue;}returnfalse;}privatestaticbooleanalgoritmo_do_staroski(intn){if(n<2){returnfalse;}if(n<4){returntrue;}if(n%2==0||n%3==0){returnfalse;}for(inti=5;i*i<=n;i+=6){if(n%i==0){returnfalse;}if(n%(i+2)==0){returnfalse;}}returntrue;}}
Renan Cesar esse problema parece ser dificil mas é só pensar um pouco.
O que é um número primo? um número para ser considerado primo só pode ser divisivel pelo número 1 ou por ele mesmo certo? Então nesse caso ele só tem dois divisores correto? cria uma variável divisores e faça um laço for e compare se o resto do numero pesquisado pela flag é igual 0 se for incremente a variável divisor.
publicstaticvoidmain(String[]args){Scannerentrada=newScanner(System.in);System.out.print("Digite um número: ");intm=entrada.nextInt();booleanePrimo=true;for(inti=2;i<=m-1;i++){if(m%i==0)ePrimo=false;}if(ePrimo==true){System.out.println("O número "+m+" é primo");}else{System.out.println("O número "+m+" não é primo");}}
}
A
anon62916717
Se jogar 25 na entrada, vai ver uma falha (contraprova) no objetivo.
Se sua codificação fosse o que alega, valeria alguns milhões de reais, seria ótimo, pois imagine a aclamação, não pelo prêmio, mas pela descoberta dos milênios.
Há matemáticos que dedicam sua vida a esta descoberta, tadinho de Carl Friedrich Gauss.
Além disso, @staroski está correto, uma das formas de otimizar a contagem é quebrando o laço da operação quando o quadrado do divisor impar incrementado de dois em dois for >= ao dividendo.
Só adicionei uma linha dentro do if, apenas para acompanhar os resultados em tempo real, ele não alterou a lógica da sua codificação.
intop,contadorPrimo=0,contadorDig=0;//Variaveisdo{//InicioDO-WHILEparacontrolarquandodesejapararoprograma;op=Integer.parseInt(JOptionPane.showInputDialog("Numerosdigitados:"+contadorDig+"\nNumerosprimosdigitados:"+contadorPrimo+"\nEntrecomnúmero:")); contadorDig++; // CONTADOR de quantos números foram digitados; ai=op;// if(op%3!=0 && op%2==1 ||op==2 || op==3){ // Inicio IF para adicionar contador de PRIMOS; contadorPrimo++; JOptionPane.showMessageDialog(null, op+"isnota\"Optmus Prime\" number");//sóadicioneiaverificação}//FimIFadionarcontadordePRIMOS}while(op!=0);//FimDO-WHILEparaprogramafecharquandodigitar0;}