Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc (http://foros.zackyfiles.com/forumdisplay.php?f=370)
-   -   Ejercicio C++, Números de Hamming (http://foros.zackyfiles.com/showthread.php?t=382678)

Snake12 16/12/2005 18:06

Ejercicio C++, Números de Hamming
 
Hola amigos, tengo un problema como de costumbre, tengo que hacer el siguiente problema:

Cita:

Realizar un programa en C++ para calcular los primeros 100 números de Hamming en orden creciente a partir de la formula:
H = 2p * 3q * 5r

En donde H representa a un número de Hamming y p, q y r son naturales. El número 1 es el primer número Hamming.

Para resolverlo se aconseja utilizar un bucle indefinido en el cual se van generando en orden los números naturales. Cada uno de ellos se factoriza y se comprueba si es múltiplo de 2, 3 o 5 únicamente, en cuyo caso se trata de un numero de Hamming, si el numero es múltiplo de cualquier otro valor (aunque también lo sea de 2, 3 o 5) no lo será.

Para factorizar un número se divide repetidamente por los números primos menores en orden exceptuando el 1 (2, 3, 5, 7, 11, etc) hasta que el resultado de una de las divisiones no de cero en ese momento se vuelve a repetir el proceso con el siguiente primo. El proceso se detiene cuando el valor a dividir es asimismo primo (o dicho de otra forma cuando al dividirlo por el primo correspondiente da de cociente 1). Los factores serán entonces los primos con los que al dividir el número ha dado algún resto cero.
Bueno, yo he hecho el ejercicio, pero creo que no está completo, es decir, yo he hecho la factorización, pero creo que me falta saber si el número es a su vez múltiplo de 2, 3 ó 5, pero no sé si ya está comprobado en el proceso anteiror, aunque creo que no. El ejercicio es este:

Cita:

int i,hamming,num, num_columnas;

cout << "Estos son los 100 primeros numeros de Hamming: " << "\n" << endl;

i = 1;
hamming = 0;
num_columnas = 0 ;
while ( hamming < 100 )
{
num = i;
while ( num % 2 == 0 )
{
num = num / 2;
}

while ( num % 3 == 0 )
{
num = num / 3;
}

while ( num % 5 == 0 )
{
num = num / 5;
}

if( num == 1 )
{
hamming++;
cout << i << ", ";

if(++num_columnas % 10 == 0)
cout << "\n" << endl;
}
i++;
}
cout << "\n" << endl;

system("Pause"); // Hacer una pausa
return 0; // Valor de retorno al S.O.
}
Bueno amigos, a ver si alguien me hecha una mano, porque la verdad, no sé si lo que obtengo son los números de Hamming o números cualesquiera.

Gracias y hasta luego!!!

Snake12 16/12/2005 19:50

Pues amigos, el ejercicio, después de muchas horas leyendo el enunciado y pensar, he llegado a la conclusión de que está bien, no le falta nada...

Lo que digo arriba es que no sabía si el número que factorizo es múltiplo de 2, 3 ó 5, pero como factorizo para 2, 3 ó 5 ,por fuerza tiene que ser múltiplo de alguno de esos números; y aunque el ejercicio diga que sólo sea múltiplo de 2, 3 ó 5, si por ejemplo el número fuese 40, sería múltiplo de 4, y como 4 es 2^2, pues es múltiplo de 2...

Bueno, no sé si me explico, pero creo que está bien, de todas maneras, si alguien me diijese si está bien o no, le estaría muy agradecido. Ta luego!!!

kolmo7 17/12/2005 02:43

Hace tiempo que no uso C y se me ha olvidado casi todo lo que se...pero en el procedimiento que empleas me parece que lo que haces es mirar uno a uno los números naturales y comprobar si son de Hamming con las divisiones sucesivas...esto es lo que te aconseja el enunciado...

¿Y no sería más fácil aplicar la fórmula directamente? Sólo habría que multiplicar por 2, 3 y 5.

1
1*2 = 2 (el número anterior por 2)
1*2*3 = 2*3 = 6 (el número anterior por 3)
1*2*3*5 = 6*5 = 30 (el número anterior por 5)
1*2*3*5*2 = 30*2 = 60 (el número anterior por 2)
1*2*3*5*2*3 = 60*3 = 180 (el número anterior por 3)
1*2*3*5*2*3*5 = 180*5 = 900 (el número anterior por 5)
...

No se si me explico...

A la hora de programarlo pintaríamos en pantalla el 1 directamente y luego haríamos un for para los productos hasta llegar a 99 (el 1, junto con los 99 del while nos dan los 100 números pedidos).

Y dentro del for, usamos unos if para ir cambiando el número por el que multiplicamos: primero por el 2 y multiplicamos, luego si esa variable vale dos la cambiamos por 3 y muliplicamos y si la variable vale 5 la cambiamos por 2 y multiplicamos. También se podría hacer con un case en lugar del if.

Snake12 17/12/2005 12:35

Muchas gracias kolmo7 por tu explicación, la entiendo, y así sería más sencillo, lo malo que ya entregué ayer el ejercicio...pero está bien como lo hice, por lo menos es algo, y utilizo una sentencia while que de eso se trataba, aunque hubiese estado mejor si aplicase también for.

Bueno, gracias de nuevo y ta leugo!!!

kolmo7 17/12/2005 15:00

Llegué tarde...lo siento.


La franja horaria es GMT +2. Ahora son las 19:11.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate