Tamanho do vetor - falta de espaço?

2 respostas
programaçãojava
D

Olá!
É minha primeira vez aqui, então me desculpem qualquer coisa :v

Estou aprendendo Java, e passei a última semana quebrando a cabeça para resolver um problema de números primos. Resolvi, e consegui um programa extremamente rápido, que era a grande dificuldade. Ele lê um número e escreve todos os primos existentes de 2 até o número, sendo o funcionamento interno acontecendo com um vetor de tamanho n + 1. O problema é que, pelo que parece, há um limite no número de posições que o vetor pode ter. Há como aumentar o tamanho máximo de um vetor? Quando dou a entrada 679000000 em diante, o seguinte erro é retornado, logo de início:

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

Tem como criar algo maior?

2 Respostas

TerraSkilll

Por que precisa de um vetor tão grande?

OutOfMemoryError indica que você está usando toda a memória que o Java dispõe para criar objetos, o que indica algum problema claro com seu programa. Se a sua lógica depende de um vetor tão grande, sugiro alterá-la, pois mesmo que você ajuste a memória da jvm, irá esbarrar no mesmo problema com um vetor não muito maior.

Se puder mostrar seu código, poderíamos sugerir melhorias.

Abraço.

D

Olá!

Na verdade, não preciso. Já consigo chegar a valores bem grandes com esse código mas, quando vi que tinha um limite, fiquei bem curioso à respeito. Talvez, se alterar a JVM não ajude muito com o tamanho, eu possa tentar usar matrizes para conseguir rodar o código com números maiores.
O algoritmo é o seguinte:

import java.util.Scanner;
public class primos_novo {

	public static void main (String [] args) {
	
		Scanner sc = new Scanner (System.in);
		int n = sc.nextInt ();
		
		boolean crivo [] = new boolean [n];
		int posicao_relativa = 0;
		int j = 0;
		
		for (int i = 0; i < n; i++){
			crivo [i] = true;
		}
		
		for (int i = 2; i < n; i++){
			if (crivo [i] == true){
				System.out.println(i);
				
				j = 2;
				while (j < n){
					posicao_relativa = i * j;
					
					if (posicao_relativa < n){
						crivo [posicao_relativa] = false;
					}else{
						break;
					}
					j++;
				}
				
			}
		}
		
	
	}

}
Criado 7 de maio de 2017
Ultima resposta 9 de mai. de 2017
Respostas 2
Participantes 2