Ae galera to fazendo esse programinha bobo pra brinca com o Java… Mas qdo eu executo a seguinte exeption aparece: “Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at TestePrimoAp.main(TestePrimoAp.java:14)”
Oq poderia ser?
agradeço desde já.
public class TestePrimoAp {
public static void main(String args[]) {
int n = (int)Math.sqrt(1000000000);
int Primos[] = new int[n];
int j=1, k=3, LimX=0, x=0;
Primos[1] = 2;
Primos[2] = 3;
for(int i=5;i<=n;i+=2){
LimX=(int)Math.sqrt(i);
while(j<=LimX){
if(x%Primos[j] != 0){
Primos[k] = x;
k++;
}
j++;
}
}
for(int l=1;l<=n;l++){
System.out.println(Primos[l]);
}
}
}
java.lang.OutOfMemoryError: Java heap space
estouro de memória…
um int bem grandinho né…
entendeu né…
eu sei que é, mas o veado do professor de ED quer uma lista desse tamanho…
Mato agora ou depois?
[quote=felipehpd]eu sei que é, mas o veado do professor de ED quer uma lista desse tamanho…
Mato agora ou depois?[/quote]
oq ele quis dizer é q seu int é grande e seu xmx lá está menor por isso n ta dando dá uma olhada em inicializando a maquina virtual no google 
Mas pq o exemplo que ele disponibilizou funciona com esse intzinho???
A diferença é o algoritmo…
[quote=felipehpd]Mas pq o exemplo que ele disponibilizou funciona com esse intzinho???
A diferença é o algoritmo…[/quote]
o int tbm é o problema deveria ser um BigDecimal ou coisa assim…
Nao nao, eu li a codificação dele… é um simples int n = (int)Math.sqtr(MAXNAT);
se ajuda vou postar o codigo aki…
class EDGxxSI2y_EDA01_CNatural implements EDGxxSI2y_EDA01_TAD_Natural
{
private String titulo = “EDGxxSI2y_EDA01_CNatural”;
public int MAXFP = 50;
public int MAXNAT = 1000000000;
public int Primos[];
public EDGxxSI2y_EDA01_CNatural(int maxnat)
{
MAXNAT = maxnat;
int n = (int)Math.sqrt(MAXNAT);
long iniciou = new Date().getTime();
String strout = " Construtor Default da classe CNatural\n\n" +
“Gerou Números Primos para aplicar o TFA\n” +
“Versão Pretensiosa para Gerar os Primos\n\n” +
"Iniciou Execução = " + new Date().toLocaleString() + “\n\n”;
int a,
p = 0;
boolean ehprimo = false;
Primos = new int[n];
Primos[p] = 2;
for (a=3; a < n; a+=2) if (EhPrimo(a)) Primos[++p] = a;
while (! ehprimo)
if (EhPrimo(a)) {
Primos[++p] = a;
ehprimo = true;
}
else a += 2;
long terminou = new Date().getTime();
strout += "Máximo para um Natural = " + MAXNAT + “\n” +
"Raiz quadrada de " + MAXNAT + " = " + n + “\n” +
"Quantidade de Primos = " + (p + 1) + “\n” +
"O último Primo gerado = " + Primos[p] + “\n” +
"O último Primo é o 1º maior que " + n + “\n\n” +
“Terminou Execução = " + new Date().toLocaleString() + " \n” +
“Tempo de Execução = " + (terminou - iniciou) + " ms\n\n”;
JOptionPane.showMessageDialog(null,strout,titulo, JOptionPane.WARNING_MESSAGE);
}
O número até que é pequeno. Só não estou vendo onde k ou j volta pra zero para poder fazer os teste p/ o próximo primo.
E como faço isso?
Algoritmo ta errado?
a codificação?
[quote=felipehpd][code]public class TestePrimoAp {
public static void main(String args[]) {
int n = (int) Math.sqrt(1000000000);
int Primos[] = new int[n];
int j =1; // o que é j?
int k=3; // o que é k?
int LimX = 0 // hum?
int x=0; // x é sempre zero?
Primos[1] = 2;
Primos[2] = 3;
// só dá pra ter idéia do que este programa
//
for (int i = 5; i <= n; i += 2) { // o que ser i?
LimX = (int) Math.sqrt(i);
while (j <= LimX){
if (x % Primos[j] != 0) {
Primos[k] = x;
k++; // o que é k?
}
j++; // e j? nunca volta pra zero, tem que iterar por todos os elementos né?
}
}
for (int l=1; l <= n; l++){
System.out.println(Primos[l]);
}
}
}[/code][/quote]
Debugue aí! Certeza que isso funciona?
[code] public class TestePrimoAp {
public static void main(String args[]) {
int n = (int) Math.sqrt(1000000000);
int Primos[] = new int[n];
int j =1; //Variavel de controle que corre em Primos, pra capturar os divisores
int k=3; // variavel de controle de inclusao em Primos
int LimX = 0; //Limite de divisoes
Primos[1] = 2;
Primos[2] = 3;
for (int i = 5; i <= n; i += 2) { //variavel de controle que representa os candidatos a primo
LimX = (int)Math.sqrt(i);
while (Primos[j]<= LimX){
if (i % Primos[j] != 0) {
Primos[k] = i;
k++;
}
j++; //j volta ao valor inicial "1"no proximo laço for, ou seja, i=6...
}
}
for (int l=1; l <= n; l++){
System.out.println(Primos[l]);
}
}
} [/code]
O algorítimo funciona p/ valores bem menores? Raiz de 100, 10000, etc?
O algoritmo funciona fiz teste de mesa diversas vezes…
eu to fazendo alguma merda na codificação… mas num consigo ver oq é…
eu to achando que tem algo errado com alguma coisa entre o for e o if.
Bem, se tá certo, tudo bem…
Esse array que ele gera tem umas 31622 posições, certo? Isso vai dar cerca de 123 KB, o que não é uma valor muito alto.
O ultimo primo dessa sequencia não deve ter um valor acima de 400 mil.
Aqui eu preciso declarar um array com 100 milhões de inteiros p/ dar java.lang.OutOfMemoryError: Java heap space, você nem chegou perto disso (a menos que esteja usando pouquissima memória, como se tivesse desenvolvendo em um celular). Então não deveria ter problemas quanto a falta de memória.
Realmente não sei o que é.