Não consigo adicionar valores a um ArrayList

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));

}

}
[/code]

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

while((i < n-1)&(ok = true)){

ok = true ou ok == true?

lembrando que sua variavel OK vai sempre ser true (você sempre faz uma atribuição e não uma comparação no while, não sei se foi de propósito…)

while((i < n-1)&(ok = true)) //ou while((i < n-1) && ok)

[edit] não tinha visto post acima… e if(ok) é a mesma coisa que if(ok == true), ambas são expressões do tipo boolean :stuck_out_tongue_winking_eye: [/edit]

Dá uma olhada no link: http://www.guj.com.br/java/81234-numeros-primos

Drigo, é o seguinte.

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.

Corrija sua declaração disso:

ArrayList n_primo = new ArrayList(); 

Para isso:

List<Integer> n_primo = new ArrayList<Integer>(); 

Isso vai tornar a manipulação da lista mais fácil, já que o método get() passará a retornar um Integer.

Ahhh entendi (eu realmente não sabia como fazer para checar se um número é primo)

então, complementando o pessoal aí de cima, seu código entra em um loop infinito…

mova o incremento de i para fora do bloco if… else… :smiley:

[edit][code]
while((i < n-1)&(ok = true)){
if(n % i == 0){
ok = false;
}else{
ok = true;
n_primo.add(n);

                 }//Fim do if do while      
                 i++;
             }//Fim do while [/code]

[/edit]

Algumas dicas para você melhorar seu código, sem usar o Crivo:

  1. 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);

  2. 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;

  3. É 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. :slight_smile:

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.

Optimizando mais, nunca terá um divisor maior que a própria raiz quadrada senão tiver um menor.

Assim deu certo:

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]

Sim, mas isso não é tão fácil de se demonstrar. Não queria só jogar uma regra e dizer “acredite em mim”, eheheh.