Fiz uma programinha para testar e brincar de java. Esse programinha mostra quais os números primos, dentro de um range de números. Não sei se funciona, pois não dá para testar, devido a não conseguir inserir valores em um ArrayList. Abaixo minha classe Primo e o TestaPrimo. O resultado está vindo vazio.
import java.util.*;
public class Primo {
//arraylist n_primo;
public ArrayList CalcPrimo(int inicio,int fim){
boolean ok;
int i,n;
ArrayList n_primo = new ArrayList();
for(n = inicio;n <= fim;n++){
if(n > 0){
i = 2;
ok = true;
while((i < n-1)&(ok = true)){
if(n % i == 0){
ok = false;
}else{
ok = true;
n_primo.add(n);
i += 1;
}//Fim do if do while
}//Fim do while
}//Fim do If
}//Fim do For
return n_primo;
}//Fim do CalcPrimo
}
[code]public class TestaPrimo {
/**
* @param args
*/
public static void main(String[] args) {
Primo p = new Primo();
System.out.println(p.CalcPrimo(1, 99));
}
Não entendi essa parte do seu código… como é a sua lógica para verificar se o número é ou não primo?
if(n > 0){
i = 2;
ok = true;
while((i < n-1)&(ok = true)){
if(n % i == 0){
ok = false;
}else{
ok = true;
n_primo.add(n);
i += 1;
}//Fim do if do while
}//Fim do while
}//Fim do If
if(n > 0){
i = 2;
ok = true;
while((i < n-1)&(ok = true)){
if(n % i == 0){
ok = false;
}else{
ok = true;
n_primo.add(n);
i += 1;
}//Fim do if do while
}//Fim do while
}//Fim do If
I = 2, porque numero 2 e 1 são primos. Logo começo a testar para valores superiores a 2. Sempre que eu encontrar um valor primo, eu seto a variavel ok para true, contrário false. Por isso, o mod de N por I. Se o resto for 0, em alguma situação, ele não é primo. Se não for, seto ok para false, como já disse. Sendo primo(resto de N por I != 0), eu então, adiciono esse número(primo) ao vetor e incremento I, para o while funcionar.
Algumas dicas para você melhorar seu código, sem usar o Crivo:
Você não precisa testar até n-1. Um número nunca será divisível por qualquer número maior que a metade dele (n/2). Afinal, isso sempre será um número fracionário entre 1.9999999 e 1.00000001 (1 é a divisão pelo próprio número, que é onde o teste termina);
Nenhum número par, exceto o próprio 2, é primo. Nesse caso, você pode fazer seu while pular de 2 em 2. Isso dobra a velocidade do algorítmo;
É ainda mais rápido se você tiver a lista de todos os primos já encontrados (inclusive os fora do intervalo). Aí vc poderia simplesmente dividir os números pelos primos lá de dentro, e não por todos os números conhecidos;
Agora que seu algoritmo já funciona do jeito “burro”, tente otimiza-lo.
Legal, vou fazer os testes, mas só quero dizer o seguinte. A finalidade desse exercício, não é descobrir um número primo, ou fazer um programa para isso. A finalidade era preencher uma lista. Poderia ser qualquer exemplo, usei esse porque já fiz isso em Delphi e poderia preencher uma lista ou array, com valores variáveis que é o meu interesse nesse momento. Eu fiz usando Genéricos, Vini e não deu certo, mas usei a lógica errada. Vou consertar e testar outra vez.
import java.util.*;
public class Primo {
public List<Integer> CalcPrimo(int inicio,int fim){
boolean ok;
int i,n;
List<Integer> n_primo = new ArrayList<Integer>();
System.out.println("Os números primos de: " + inicio + " até " + fim + " são: ");
for(n = inicio;n <= fim;n++){
if(n > 0){
i = 2;
ok = true;
while((i < n)&&(ok == true)){
if(n % i == 0){
ok = false;
}else{
ok = true;
}//Fim do if do while
i += 1;
}//Fim do while
if(ok){
n_primo.add(n);
}
}//Fim do If
}//Fim do For
return n_primo;
}//Fim do CalcPrimo
}
O resultado para um range de 1 a 99 foi esse: [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]