¿Cómo desarrollar una aplicación para calcular números perfectos?

Me han pedido que desarrolle una aplicación para calcular números perfectos del 1 al 1000:
Mi pseudocodigo es el siguiente:
Algoritmo Perfecto
var
Int: i, j, suma
Inicio
       desde i = 1 hasta 1000 hacer
               suma = o
                        desde j = 1 hasta j<i hacer
                           si i % j = 0 entonces
                           suma = suma + j
                           Fin si
                         Fin desde
                  si suma = i entonces
                 Escribir(i, 'es perfecto')
                  Fin si
        Fin desde
Pero me han pedido que imprima los factores de cada numero perfecto para confirmar que lo sea y yo le he agregado este codigo en java a continuación de donde deje el pseudocodigo;
 for(int i = 1; i <= 1000; i = i + 1)
        {
            for (int j = 1 ; j < i; j = j + 1)
            {
                if(i == 6 || i == 28 || i == 496)
                System.out.printf(" %d", i/j);
           }
        }
¿Me convendrá colocar los números perfectos en el if para que me de los factores o no es válido?

1 Respuesta

Respuesta
1
Te paso el código que te respondí en un post anterior, con los añadidos necesarios para imprimir los factores:
int suma, numfactores;
java.util.ArrayList<Integer> factores;  
for(int i=1; i<= 1000; i++){ 
  suma = numfactores = 0;
  factores = new java.util.ArrayList<Integer>();
  for(int j=1;j<i; j++){  
    if(i % j == 0){  
      suma += j;
      factores[numfactores] = j;
      numfactores++; 
    } 
  } 
  if(i == suma){  
    System.out.printf("%d es perfecto\n", i); 
    System.out.println("...y sus factores son: ");
    for (int factor:factores){
       System.out.printf("%d ", factor);
    }
  } 
}
Muchísimas gracias por tu respuesta y por tu solución, quisiera realizarte dos preguntas:
1) Yo realice una clase para calcular los perfectos desde 1 a 1000 y los factores de esta manera considerando que no hemos visto aún array:
public class Perfecto {
int x = 6;
int y = 28;
int z = 496;
public void determinarPerfecto()
{
int suma;
for(int i = 1; i <= 1000; i = i + 1)
{
suma = 0;
for(int j = 1; j < i; j = j + 1)
{
if(i % j == 0)
suma = suma + j;
}
if(suma == i)
System.out.printf("%d es perfecto\n", i);
}
}
public void pasar()
{
perfecto(x);
perfecto(y);
perfecto(z);
}
private void perfecto(int n)
{
System.out.printf("\n%d = ", n);
for(int i = 1; i < n; i = i + 1)
{
if(n % i == 0)
System.out.printf(" %d", i);
}
}
}
Obviamente después instacio un objeto para llamar ambos métodos desde el main, ¿tu crees que me lo tomarán bien ya que me han pedido solución con lo visto hasta ahora que solamente es clase y método?
2)Por lo que alcanzo a interpretar esta línea java. Útil. ArrayList<Integer> factores; ¿Es una clase del paquete java. Útil para trabajar con arrays?
Como siempre me despido agradeciéndote por tu disponibilidad y rápidas respuestas deseando que te encuentres muy bien, saludos!
La clase ArrayList es una especie de lista de objetos. A partir de la versión 5 de java, se puede "tipar", es decir, definir el tipo de dato que va a contener, en este caso, objetos de tipo Integer.
Si no has dado esta clase, puede que el profe se mosquee un poco...¿al menos puedes usar arrays simples, es decir, int[]?
Lo de definir las tres variables con los números perfectos ya calculados no me parece nada correcto. Yo optaría por crear la clase Perfecto, con un único método "determinaPerfectosMenoresQue(int numero)". En el main, llamaría a este método, pasando 1000 como parámetro.
Dentro de este método, metería el código que te pasé, pero sustituyendo ArrayList por un array simple de int (es decir, int[]):
public void determinaPerfectosMenoresQue(int numero){
int suma, numfactores;
int[] factores;
for(int i=1; i<= numero; i++){
suma = numfactores = 0;
factores = new int[300];
for(int j=1;j<i; j++){
if(i % j == 0){
suma += j;
factores[numfactores] = j;
numfactores++;
}
}
if(i == suma){
System.out.printf("%d es perfecto\n", i);
System.out.println("...y sus factores son: ");
for (int j=0; j<numfactores; j++){
System.out.printf("%d ", factores[j]);
}
}
}
}
Muchas gracias por tu respuesta, yo lo había hecho de esa manera porque directamente todavía no hemos entradao en arrays.
Le hago una consulta teniendo en desarrollo tu algoritmo, cuando imprimo los factores no he logrado que me muestra como los factores el 1, ejemplo me imprime:
6 es perfecto
Y sus factores son
3
2
Y no me imprime el 1, no se porque será, bueno antes de despedirme te vuelvo a dar las gracias por tu tiempo y disponibilidad, que estés muy bien, saludos!
He probado el código que te pasé y a mí me imprime perfectamente el 1. Asegurate de no haber cambiado nada.
Muchísimas gracias por tu disponibilidad estabas en lo cierto me había equivocado en una asignación en mi pseudocodigo y lo traspase mal a java, muchas gracias por tu ayuda y paciencia y aparte me he adelantado comprendiendo algo de array, que estés muy bien saludos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas