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.
Um número é primo se seus únicos divisores forem 1 e ele mesmo.
Portanto:
- Pegue um número qualquer;
- Divida-o por 2. Se for divisível, não é primo.
- 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.
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.
Seu for começa numa divisão por 0. Como isso poderia dar certo?
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.
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:
- O seu loop(for) começa comparando da posição i=2, deve começar da posição 0.
- 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”.
- 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.
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:
[code]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”);
}
}
}[/code]
Exatamente isto Vini! Parabéns, está corretíssimo.
Será que ele terá mais dúvidas depois do seu post? DIFICIL!
Abraço.
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.