Algoritmo de Eratóstenes/ajuda em erro com array

4 respostas
KamillaaH

Gente, sou nova aqui e faço faculdade de Engenharia de Software. Estou no segundo semestre e fazendo a matéria de Orientação a Objetos.
Tenho que entregar amanhã um algoritmo que indique todos os números primos de 0 até um número escolhido. Usei o algoritmo de Eratóstenes para fazer isso, só que tenho tido um problema com os arrays que não consigo corrigir. Podem me ajudar? Aí vai o código que eu fiz…

public class Eratóstenes {
	
	int i,j;
	float raiz;
	int ReceberPrimos;
	//limite até o qual serão calculados os primos
	int MaxNum = 13;
	
	void ContarPrimo(){
	//vetor para armazenar os primos
	int[] VetMaxNum = new int[MaxNum];

	
	raiz = (int) (Math.sqrt(MaxNum));//calcular a raiz quadrada de MaxNum
		
	//listando todos os números a partir
		for(i=0;i<=MaxNum;i++){
			VetMaxNum[i] = i;
			}
		
	//Aqui eu já risco os números 0 e 1 por não serem primos
		VetMaxNum[0]=0;
		VetMaxNum[1]=0;
		
	
			/*Enquanto eu tiver um número menor que a raíz do  MaxNum crivo os múltiplos de tal
			 * número, isso é possível pois o menor primo que divide um número nunca pode ser 
			 * maior que a raíz quadrada desse número.
			 */
			
		i=2; j=2;
		//riscar todos os múltiplos dos numeros primos, a começar pelos multiplos de 2
			do{
				if(VetMaxNum[i]!= 0){
					for(i=j;i<=MaxNum;i++){
						i=(j*i);
						VetMaxNum[i]=0;
					}
				}
				i=i+1;
			}while(j<=raiz);
			
			
			
			System.out.println("Os primos são: ");
			for(j=0;j<=MaxNum;j++){
				if(VetMaxNum[j]!=0){
					ReceberPrimos = VetMaxNum[j];
					
				}
					System.out.println(ReceberPrimos);
				}
			}
			

	
	public static void main(String[] args) {
		
		Eratóstenes objeto = new Eratóstenes();
		objeto.ContarPrimo();

	}

}

E quando compilo é apresentado o seguinte erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 13
	at Eratóstenes.ContarPrimo(Eratóstenes.java:21)
	at Eratóstenes.main(Eratóstenes.java:63)

Quem pude ajudar, eu agradeço! =)

4 Respostas

Andre_Brito

O máximo ali é 13. Isso indica que o tamanho do array é 13, mas vai de 0 à 12, inclusive.

No primeiro for, você faz de 0 até 13, inclusive. Faça de 0 até 13, ‘exclusive’:

for (i = 0; i < maxNum; i++) //...

E para os outros também.

KamillaaH

Fiz assim:

public class Eratóstenes {
	
	int i,j;
	float raiz;
	int ReceberPrimos;
	//limite até o qual serão calculados os primos
	int MaxNum = 13;
	
	void ContarPrimo(){
	//vetor para armazenar os primos
	int[] VetMaxNum = new int[MaxNum];

	
	raiz = (int) (Math.sqrt(MaxNum));//calcular a raiz quadrada de MaxNum
		
	//listando todos os números a partir
		for(i=0;i < MaxNum;i++){
			VetMaxNum[i] = i;
			}
		
	//Aqui eu já risco os números 0 e 1 por não serem primos
		VetMaxNum[0]=0;
		VetMaxNum[1]=0;
		
	
			/*Enquanto eu tiver um número menor que a raíz do  MaxNum crivo os múltiplos de tal
			 * número, isso é possível pois o menor primo que divide um número nunca pode ser 
			 * maior que a raíz quadrada desse número.
			 */
			
		i=2; j=2;
		//riscar todos os múltiplos dos numeros primos, a começar pelos multiplos de 2
			do{
				if(VetMaxNum[i]!= 0){
					for(i=j; i< MaxNum;i++){
						i=(j*i);
						VetMaxNum[i]=0;
					}
				}
				i=i+1;
			}while(j<=raiz);
			
			
			
			System.out.println("Os primos são: ");
			for(j=0; j< MaxNum;j++){
				if(VetMaxNum[j]!=0){
					ReceberPrimos = VetMaxNum[j];
					
				}
					System.out.println(ReceberPrimos);
				}
			}
			

	
	public static void main(String[] args) {
		
		Eratóstenes objeto = new Eratóstenes();
		objeto.ContarPrimo();

	}

}

E aconteceu isso:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 22
	at Eratóstenes.ContarPrimo(Eratóstenes.java:40)
	at Eratóstenes.main(Eratóstenes.java:63)
Andre_Brito
Acontece porque você tá mudando o valor de i dentro de um for.
do {  
    if(VetMaxNum[i]!= 0){  
        for(i=j; i< MaxNum;i++){  
            i=(j*i);  // aqui
            VetMaxNum[i]=0;  
        } 
}
i começa com 2. Dentro do for, i vira 4. i vai pra 5. Dentro do for, i vai pra 10. i vai pra 11. Dentro do for, i vai pra 22 e ainda assim tenta acessar o vetor.

Você deve fazer um teste de mesa quando uma ArrayIndexOfBoundsException acontecer. É só erro de lógica isso.

Uma implementação do Crivo de Erast. (se é essa que você tá fazendo mesmo):
boolean[] primos = new boolean[n + 1];
Arrays.fill(primos, true);
primos[0] = false;
primos[1] = false;
int m = Math.sqrt(n);

for (int i = 2; i <= m; i++)
    if (primos[i])
        for (int k = i * i; k <= n; k += i)
            primos[k] = false;
onde n é o valor entrado.
KamillaaH

Obrigada! o/

Vou ver o que faço aqui! ^^

Criado 8 de setembro de 2009
Ultima resposta 8 de set. de 2009
Respostas 4
Participantes 2