Ayuda con 20 primeros numeros perfectos
Necesito crear una aplicacion k me permita hallar los 20 primeros numeros perfectos, un numero perfecto es de la forma 2^n*(2^n-1) cuando (2^n-1) es un numero primo, y consigo hallar los 8 primeros, xo los siguientes ya no les haya. ¿Qué puedo hacer para acelerar la ejecucion?¿alguna otra alternativa?
Aquà stá mi codigo:
void mostrarPerfectos(){
double n=2;
int i=0;
while (i<20){
if (esPrimoValido(n)){
System.out.println(Math.pow(2,n-1)*(Math.pow(2,n)-1));
i++;
n++;
}
else{
n++;
}
}
}
boolean esPrimoValido(double n){//determina si (2^n)-1 es primo
boolean exito=false;
if (esPrimo(Math.pow(2,n)-1)){
exito=true;
}
return exito;
}
boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<n/2+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}
}
Aquà stá mi codigo:
void mostrarPerfectos(){
double n=2;
int i=0;
while (i<20){
if (esPrimoValido(n)){
System.out.println(Math.pow(2,n-1)*(Math.pow(2,n)-1));
i++;
n++;
}
else{
n++;
}
}
}
boolean esPrimoValido(double n){//determina si (2^n)-1 es primo
boolean exito=false;
if (esPrimo(Math.pow(2,n)-1)){
exito=true;
}
return exito;
}
boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<n/2+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}
}
Hola Carlos1990!
Yo tuve un ejercicio parecido!!
Estuve mucho tiempo dandole vueltas pero no conseguà mucho.
El único consejo que te puedo dar es, que en lugar de comprobar todos los números, compruebes, solo los números impares. Excepto el 2, los restantes números primos son todos impares.
Asà que te recomiendo que tratando el 2 como un caso inicial, compruebes a continuación los numero impares. En lugar de n++, tendra que hacer n +=2, a partir de n = 3.
Otra mejora es esta, en la funcion esPrimo
boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<Math.ceil(Math.sqrt(n))+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}
es decir, en lugar de comprobar hasta n/2+1, comprobar hasta la raiz cuadrada de n redondeado hacia arriba. Un ejemplo para que lo entiendas, la raiz de 100 es 10. Por tanto comprobariamos si 100 es primo hasta que n = 11, por ejemplo dividirlo por 25, serÃa los mismo que por 4, ya hubieramos salido del bucle en n = 4, asà que no hace falta seguir.
Bueno no se si me he explicado bien, pero se que es correcto porque es la corrección que tuve yo en mi ejercicio, jejeje.
Espero que te haya servido! Ysi tienes dudas, me lo dices, :-D !!
Saludos!!
Yo tuve un ejercicio parecido!!
Estuve mucho tiempo dandole vueltas pero no conseguà mucho.
El único consejo que te puedo dar es, que en lugar de comprobar todos los números, compruebes, solo los números impares. Excepto el 2, los restantes números primos son todos impares.
Asà que te recomiendo que tratando el 2 como un caso inicial, compruebes a continuación los numero impares. En lugar de n++, tendra que hacer n +=2, a partir de n = 3.
Otra mejora es esta, en la funcion esPrimo
boolean esPrimo(double n){//determina si un numero es primo
boolean exito = true;
double resto;
for(int i = 1; i<Math.ceil(Math.sqrt(n))+1 && exito ; i++){
resto = n % i;
if(resto == 0 && i != 1)
exito = false;
}
return exito;
}
es decir, en lugar de comprobar hasta n/2+1, comprobar hasta la raiz cuadrada de n redondeado hacia arriba. Un ejemplo para que lo entiendas, la raiz de 100 es 10. Por tanto comprobariamos si 100 es primo hasta que n = 11, por ejemplo dividirlo por 25, serÃa los mismo que por 4, ya hubieramos salido del bucle en n = 4, asà que no hace falta seguir.
Bueno no se si me he explicado bien, pero se que es correcto porque es la corrección que tuve yo en mi ejercicio, jejeje.
Espero que te haya servido! Ysi tienes dudas, me lo dices, :-D !!
Saludos!!
