domingo, 31 de octubre de 2010

Deitel_C++_3.29 (Números Perfectos en C++)

Con este programa empiezo a subir algunos ejercicios en C++. Este blog pretende ser un solucionario de los libros de Deitel, por lo cual no queda fuera de lugar incluir estos problemas resueltos aqui. Como mencioné en la primera entrada (Propósito, de junio de 2010), los números de los ejercicios corresponden a los que vienen en la cuarta edición de C++ Cómo Programar, de Deitel y Deitel. Ese libro es bastante viejo y algunos de los encabezados están obsoletos, sin embargo los programas están actualizados y deberán correr en cualquier compilador actual sin ningún mensaje de advertencia. Tengo a la mano la quinta edición del libro de Deitel y los programas parecen coincidir en el número. Sin embargo hay que tener en cuenta que con con respecto a la sexta edición podrían haber cambiado. Los textos de Deitel conciernen a varios lenguajes de programación, sin embargo, los ejercicios son prácticamente los mismos en todos los libros. Así pues, si require de una solución de el texto, digamos en C#, debe ser fácil cambiar el lenguaje siguiendo los algoritmos.

_____________________________________________________________________________________
3.29 Se dice que un entero es un número perfecto, si la suma de sus factores, incluyendo 1 (pero no el número mismo), es igual al número. Por ejemplo, 6 es un número perfecto, ya que 6 = 1 + 2 + 3. Escriba una función Perfecto que determine si el parámetro número es un número perfecto. Utilice esta función en un programa que determine y despliegue todos los números perfectos entre el 1 y el 1000. Despliegue los factores de cada número perfecto para confirmar que en realidad el número es perfecto. Rete al poder de su computadora, probando números mucho mayores que 1000.
_____________________________________________________________________________________
Solución:

El siguiente programa imprime los numeros perfectos entre 1 y 1000. Un número perfecto es aquél que es igual a la suma de sus factores, incluyendo el 1 y desde luego excluyendo al propio número. Este problema también aparece resuelto en java: Deitel_Java_6.24
Una ejecución de este programa produce la siguiente salida:

Determinacion de numeros perfectos entre 1 y 1000.


6 es igual a la suma de:
1 2 3 

28 es igual a la suma de:
1 2 4 7 14 

496 es igual a la suma de:
1 2 4 8 16 31 62 124 248 


Y éste es el código:

 //Determina los numeros perfectos entre uno y mil.

 #include <iostream>
 using namespace std;

 int Perfect (int);
 void PrintPerfect(int);

 //////////////////////////////////////////////////////////
 // MAIN
 //////////////////////////////////////////////////////////
 
 int main()
 {    // abre main
 int s;

 cout<<"Determinacion de numeros perfectos entre 1 y 1000."<<endl;

 for (int counter = 1; 1000 >= counter;++counter)
 {  // Abre for
 s = Perfect (counter);

 if (1 == s)
 PrintPerfect (counter);
 }  // Cierra for

 cout <<endl << endl;
 
 return 0;
 }   // cierra main
 
 //////////////////////////////////////////////////////
 // PERFECT
 //////////////////////////////////////////////////////
 
 int Perfect (int n)

 {

 int suma = 0, factor;

 for (int divisor = 1; divisor < n; ++ divisor)
 {  //Abre for

 if (0 == n % divisor)
 {     // Abre if
 factor = divisor;
 suma += factor;
 }     // Cierra if

 }   //Cierra for

 if ( suma == n)
 return 1;

 else
 return 0;
 }

/*////////////////////////////////////////////////////////////////
// PRINTPERFECT
////////////////////////////////////////////////////////////////*/
 void PrintPerfect (int m)
 
 {
 cout <<endl<<endl<< m << "\tes igual a la suma de:"<<endl;

 for (int divisor = 1; divisor <m; ++divisor)
 if (0 == m%divisor)
 cout << divisor << "\t";

 return;
 }

2 comentarios:

Related Posts Plugin for WordPress, Blogger...