viernes, 24 de junio de 2011

Deitel_Java_6.24 (Números perfectos en Java)

6.24 Se dice que un número es un número perfecto si sus factores, incluyendo 1 (pero no el número entero), al sumarse dan como resultado el número entero. Por ejemplo, 6 es un número perfecto, ya que  6 = 1 + 2 + 3. Escriba un método llamado Perfecto que determine si el parámetro número es un número perfecto. Use este método en una aplicación que determine y muestre todos los números perfectos entre 1 y 1000. Imprima los factores de cada número perfecto para confirmar que el número sea realmente perfecto. Ponga a prueba el poder de su computadora, evaluando números más grandes que 1000. Muestre los resultados.

Este problema también aparece resuelto en C++ en Deitel_C++_3.29.  En lugar de establecer 1000 como límite superior, se pide al usuario que lo introduzca. Para 10000 la salida es la siguiente:
Este programa imprime los numeros perfectos entre                                                               
 1 y un numero dado.                                                                                            
                                                                                                                
Por favor introduzca un entero positivo:                                                                        
10000                                                                                                           
6 =       1       2       3                                                                                     
                                                                                                                
28 =      1       2       4       7      14

496 =     1       2       4       8      16      31      62     124     248

8128 =    1       2       4       8      16      32      64     127     254     508     1016    2032    4064


El siguiente código debe guardarse con el nombre UsaDeitel_6_24.java
 
 import java.util.Scanner;

 public class UsaDeitel_6_24

 {        // Abre clase UsaDeitel_6_24

 public static void main(String args[])

 {         // Abre main

 Scanner entrada = new Scanner(System.in);
 int numero;
 Deitel_6_24 miObjeto = new Deitel_6_24();

 System.out.println("\nEste programa imprime los numeros perfectos entre");
 System.out.println(" 1 y un numero dado. ");

 do
 {         // Abre do
 System.out.println("\nPor favor introduzca un entero positivo: ");
 numero = entrada.nextInt();
 } while ( 0 > numero );      // Cierra do

 miObjeto.Perfecto(numero);

 }         // Cierra main
 }        // Cierra clase UsaDeitel_6_24

El siguiente código debe guardarse con el nombre Deitel_6_24.java

 public class Deitel_6_24

 {     // Abre Deitel_6_24


 //////////////////////////////////////////
 //METODO PERFECTO
 /////////////////////////////////////////
 public void Perfecto( int N )

 /* El metodo Perfecto recibe el limite superior
    es decir el numero hasta el que debe buscar perfectos.
    */
 {           // Abre metodo perfecto
 
 int cuenta = 0; 

 // La variable cuenta se utiliza para ir sumando los factores
 // del numero j, al final se verifica la condicion de que esa
 // suma sea igual al numero j. Si es asi, solo si es asi, se
 // manda a imprimir el numero. Esto porque de otra manera se
 // tendria que ir almacenando cada vez los factores, pero no 
 // se tiene a priori el numero, asi que no se sabe cuantas 
 // variables hay que declarar. Por lo tanto he decidido 
 // usar otro metodo para imprimir el numero que resulte perfecto.
 

 for ( int j = 1; j <= N; j++ ) 
 {       // Abre for

 cuenta = 0;
 // La variable cuenta se debe poner en cero cada vez que se 
 // analiza otro numero.
  
 for ( int i = 1; i <= j/2 ; i++ ) 

 // Solo hay que buscar los factores hasta j/2, porque despues
 // de ese numero ya no hay mas. 
 
 if( 0 == j % i )
 cuenta += i; 

 // Si la variable i es un  factor, se suma
 
 if ( cuenta == j )
 // Si la suma de los factores es igual al numero, entonces
 
 {      // ABre if
 Imprime(j);
  // se imprime
 }  // Cierra if
 }      // Cierra for
 }           // Cierra metodo perfecto


 //////////////////////////////////////
 //METODO IMPRIME
 //////////////////////////////////////
   
 public void Imprime( int x )
 
 // Esta funcion primero imprime el numero 
 {           // Abre Imprime
  
 System.out.printf("%d = ", x);
  
 for ( int s = 1; s <= x/2; s++ )
 {     // Abre for
 if ( 0 == x%s )
 System.out.printf("\t%3d", s);
 // y despues imprime los factores
 }     // Cierra for

 System.out.println("\n");

 }           // Cierra Imprime     
 
 }     // Cierra Deitel_6_24

2 comentarios:

Related Posts Plugin for WordPress, Blogger...