Calcular numero primo e indice, preciso de ajuda.[RESOLVIDO]

8 respostas
garotinhodejesus

não estou conseguindo calcular se numero é primo.

import javax.swing.*;

     public class Exercicio3 {

        public static void main(String[] args) {

            int numeros[] = new int[9];
            for (int i = 0; i < numeros.length; i++) {

                numeros[i] = Integer.parseInt(JOptionPane.showInputDialog("Digite o " + (1 + i) + "º numero"));

           }
           for (int i = 2; i < numeros.length; i++){

               if (numeros[i] % 2 != 0) {
                   int primos = 0;
                   primos = i;
                   System.out.println(primos);
                   System.out.println(i);
               }
           }
       }
       }

se puderem me ajudar.

8 Respostas

ViniGodoy

Um número é primo se seus únicos divisores forem 1 e ele mesmo.

Portanto:

  1. Pegue um número qualquer;
  2. Divida-o por 2. Se for divisível, não é primo.
  3. Em seguida, divida-o por 3, 5, 7, 9, 11… até chegar a um valor maior que a metade do número. Se ele for divisível por qualquer um, não é primo.
    Caso contrário, é primo.
garotinhodejesus

blz vini, entendi o raciocinio sobre numero primo. não estou entendendo qual a formula pra faze-lo no codigo apresentado.
eu fiz uma formula if(numeros[i]%1==0), mais ela ta dando erro. gostaria de saber onde esta o erro e como corrigi-lo.

ViniGodoy

Seu for começa numa divisão por 0. Como isso poderia dar certo?

garotinhodejesus

vini ja alterei o codigo mais ainda não consegui o resultado. podem me dar mais alguma dica. por exemplo eu tenho que usar mais um for ou so um para ler o vetor e dizer qual é primo.

felipebonezi

O seu erro lógico está nestas linhas…

for (int i = 2; i < numeros.length; i++){

               if (numeros[i] % 2 != 0) {
                   int primos = 0;
                   primos = i;
                   System.out.println(primos);
                   System.out.println(i);
               }
           }
       }
       }

Ajudando:

  1. O seu loop(for) começa comparando da posição i=2, deve começar da posição 0.
  2. O seu if está apenas dizendo se o numero é par ou ímpar. Por exemplo, o numero ‘21’ não é divisível por ‘2’, mas é por ‘3’. Então não é primo. No seu algoritmo ta dizendo que é “primo”.
  3. Para um numero ser primo, ele só pode ser divisivel por 1 e por ele mesmo e todo número é divisivel por 1 e por ele mesmo, então suas comparações você só precisa utilizar numeros entre 1 e o numero, ainda colocando a condição de apenas comparar o ‘2’ e depois só utilizar os números ímpares pois ‘2’ é o único numero primo PAR.
for(i=0;i<numero.lenght;i++) {
    for(i=3;i < numero[i];i++) {
        if(numero[i]%2==0&&numero[i]!=2||numero[i]%i==0) //Mais ou menos esta a idéia.
            System.out.println("Nao é primo");
    }
}
//P.S.: Neste caso, dois loop for é recomendado para comparar um certo numero de numeros, e comparar do 3 ao numero.
ViniGodoy

Você precisa de 2 for.

Um deles para percorrer o vetor. Outro para testar se o número é primo ou não.

O ideal é fazer uma função, primeiro, que simplesmente diga se um único numero é primo ou não. Depois, aplique essa função para o vetor inteiro.

Seria mais ou menos assim:

public static boolean ePrimo(int numero) {
   //Todo par, exceto o 2, não é primo
   if (numero != 2 && numero % 2 == 0) 
      return false;

   //Testa todos os divisores impares menores que 
   //metade do número
   for (int i = 3; i < (numero/2); i+=2) {
      if (numero % i == 0) {
         return false;
      }
   }

   //Se não tem divisores, é primo
   return true;
}

public static void main(String[] args) {
   for (int numero : numeros) {
      if (ePrimo(numero)) {
         System.out.println("O número " + numero + " é primo");
      } else {
         System.out.println("O número " + numero + " não é primo");
      }
   }
}
felipebonezi

Exatamente isto Vini! Parabéns, está corretíssimo.

Será que ele terá mais dúvidas depois do seu post? DIFICIL!

Abraço.

ViniGodoy

O método poderia ser ainda um pouco mais otimizado. Na verdade, é possível testar só até a raiz quadrada do número. Mas isso não é intuitivo, nem seria fácil de demonstrar aqui no fórum.

Quanto a testar até a metade, é bem óbvio. Se você dividir um número por ele mesmo, obtém 1. Se dividir pela metade dele, obtém 2.
Logo, dividir por alguém que esteja entre esse intervalo, certamente resultará num número fracionário entre 1 e 2 e, portanto, não será um divisor.

Com uma lista de primos (que poderia ser gerada pelo crivos de erastótenes), também seria possível testar apenas pelos primos no intervalo. Isso deixaria o programa ainda mais rápido, ao custo de um pouco de memória.

Criado 27 de março de 2011
Ultima resposta 28 de mar. de 2011
Respostas 8
Participantes 3