Conjetura de Collatz

David Vega

Programa que muestra la conjetura de Collatz para un número dado por el usuario.

/* Este programa, dado un número "a", introducido por el usuario, muestra
en pantalla la conjetura de Collatz para ese número. Dado un número natural
"a", si "a" es par lo dividimos entre 2; si "a" es impar lo triplicamos y
le sumamos 1. Sobre el número resultante de la acción correspondiente a la
paridad de "a", volvemos a llevar a cabo la acción. La conjetura de Collatz
dicta que después de un número determinado de repeticiones, llegaremos al
número 1. */

// Programa creado por David Vega.

#include <iostream>
using namespace std;
#include <windows.h>
// Librería para poder incluir el Sleep(), que retrasa la acción que va después.

bool paridad(int a);
/* Vamos a utilizar una función booleana; la llamamos función de paridad
del entero "a". Como se dijo en clase, la función booleana devuelve sólo
dos valores: cierto (1) o falso (0). */

int main()
{
 int a,b;
 cout << "Dime un numero natural: ";
 cin >> a;
 if (a>=1)
/* Vamos a condicionar todo el bloque de código del programa
para utilizar la conjetura sólo si el entero (int) "a" es natural
(un entero mayor o igual que 1) */
 {
 while (a !=1)
/* El loop "while" sirve para repetir una serie de acciones (que están
dentro de las llaves {}), si se cumple la condicion entre paréntesis;
en este caso, la condicion es que "a" no sea igual a 1 (el simbolo !
niega la igualdad). Se sale del loop cuando la condición no se cumple */
 {
 Sleep(2000);
/* He introducido un retraso de 2 segundos (2000 milisegundos)
para cada iteración, con intención de facilitar al usuario la lectura del output. */
 if(paridad(a) == true)
/* Ahora determinamos la paridad utilizando nuestra función. Si la función
determina que "a" es par: */
 {
 cout << a << " es par." << endl;
 Sleep(500);
 b=a/2; // Dividimos entre 2 dicho número.
 cout << endl << a << "/2= " << b << endl; // Mostramos la operación en pantalla.
 a=b;
/* Ahora llamamos al resultado (que era "b") "a", de nuevo. Si a=1, se
cumple la conjetura y salimos del loop; si "a" no es 1, volvemos a determinar
su paridad. */
 }
 else // Si la función determina que "a" no es par:
 {
 cout << a << " es impar." << endl;
 Sleep(500);
 b=3*a + 1; // Multiplicamos por 3 y sumamos 1 a dicho número.
 cout << endl << "3x" << a << "+1= " << b << endl;
// Mostramos la operación en pantalla.
 a=b;
/* Ahora llamamos al resultado (que era "b") "a", de nuevo. Si a=1,
se cumple la conjetura y salimos del loop; si "a" no es 1, volvemos
a determinar su paridad. */
 }
 }
 cout << endl << "Hemos llegado al 1; se cumple la conjetura \n"
       << " de Collatz para el numero que has elegido." << endl << endl;
 system("PAUSE");
// Encontré que si se pone PAUSE con mayúsculas no hay que incluir librerías adicionales
 }
 else
/* Esto ocurrirá si "a" no es mayor o igual que uno, es decir, si el entero "a"
introducido al principio no es natural. */
 {
 cout << "El numero " << a << " no es natural.";
 system("PAUSE");
 }

 return 0;
}

bool paridad( int a ) // Definimos la función de paridad del entero "a".
{
 if ( a % 2== 0 ) // El operador % calcula el resto de la división a/2.
 return true; // Si dicho resto es igual a cero, el número es par.
 else // Si no es así,
 return false; // el número es impar.
}
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s