[C con Clase] Esta es la respuesta correcta (no la otra) Necesito la lógica de este problema (arreglos).

jagse jagse en intercomgi.com
Vie Jun 17 12:12:46 CEST 2011


Hola Diego:

 

Tienes razón, me tiré a la piscina sin pensarlo demasiado.

Bueno, creo que he encontrado la lógica del proceso.

 

El número que te dan es el número que se ha de obtener al final.

Luego apliquemos la lógica a la inversa.

 

1.- Si ese número es par la última tecla ha de ser un 2 y si es impar ha de
ser un 1.

2.- Es decir que si el número es m y es par el número anterior sería m/2 y
si es impar  m-1.

3.- Nos queda el número m/2 ó el m-1 y volvemos a empezar en el paso 1 hasta
que nos dé cero.

Y la secuencia de 2 y 1 será la obtenida de estos tres pasos pero a la
inversa, ya que queremos construir

un número m a partir de cero.

 

Ejemplo:

 

Nro 34:

 

Visor    Tecla

34                 2

17                 1

16                 2

8                  2

4                  2

2                  2

1                  1

0

 

Luego la secuencia sería 1,2,2,2,2,1,2  (5 doses y 2 unos) uno menos que el
ejemplo que puse ayer.

 

Nro 12:

 

Visor                Tecla

12                2

 6              2

 3              1

 2              2

1               1

0

 

Luego la secuencia sería 1,2,1,2,2 (la misma que planteaste tú)

 

Nro. 100:

 

Visor                Tecla

100             2

50               2

25               1

24       2

     12        2

       6        2

       3        1

       2        2

       1        1

       0

 

La secuencia sería 1,2,1,2,2,2,1,2,2

 

 

 

Bueno, creo que esta vez está resuelto.

 

Antonio

 

  _____  

De: Diego [mailto:diegoartesanal en gmail.com] 
Enviado el: viernes, 17 de junio de 2011 3:03
Para: Lista de correo sobre C y C++
Asunto: Re: [C con Clase]Esta es la respuesta correcta (no la otra) Necesito
la lógica de este problema (arreglos).

 

Antonio: 

Agradezco tu respuesta, estoy probando ahora pasar a c++ la lógica que me
mostraste. He notado igualmente una observación que quería hacerte . 
Ya que según lo pedido en el problema, además de obtener el número de veces
que apreta 1 y 2, dice:

 


b) muestre la cantidad de veces que debera apretar el boton 1
y la cantidad de veces que debera presionar el boton 2
para obtener, en la menor cantidad posible de pasos, el numero "m" el en
visor
indique la manera en q debe apretarse los botones.

Esto de la menor cantidad de posible de pasos me llevó a observar si existe
una menor cantidad de pasos de la que arroja el algoritmo que me pasaste y
he notado que sí. Te muestro:


*-*-* EJEMPLO *-*-*
Supongamos que ingresamos como 'm' = 12

Basándome en lo que me planteaste, divido entre 2 el 'm' hasta que el
cociente sea menor a 2. Y voy contando la cantidad de veces que divide.

m=12
contador= 0

12 / 2 = 6 , contador = 1
6/2 = 3, contador = 2
3/2 = 1.5 , contador = 3

Ahí finalizaría el bucle. Ok, entonces las veces que debe la tecla '2'
sería: 3



Para obtener cuantas veces debe apretar '1' recurro a la formula que me
diste..

2 ^ contador(que es 3) = 8 

Las veces que se deba apretar '1'', según lo que me dijiste sería ( m - el
resultado anterior ) , en este caso

12 - 8 = 4 ( las veces que debe apretar 1 , y le tenemos que sumar un 1 ) 


4+1 = 5 veces debe apretar la tecla '1'

Bien , ahora he obtenido:

* La tecla '2', se debe apretar 3 veces.
* La tecla '1', 5 veces.

Mi secuencia sería

Tecla           Valor
'1'                  1
'2'                  2
'2'                  4
'2'                  8
'1'                  9
'1'                  10
'1'                  11
'1'                  12

Como vemos, la secuencia cumple con la cantidad de veces que debe apretarse
cada uno: la tecla '2' tres veces, y la tecla '1' , cinco veces.

Secuencia quedaría ->  1, 2, 2, 2, 1, 1, 1, 1 ....


Bueno, ahora el asunto es que encontré una secuencia de menos pasos.. Mira
esto:

m=12

Si hago la secuencia de esta manera:

Secuencia : 1,2,1,2, 2



Tecla           Valor
'1'                  1
'2'                  2

'1'                  3
'2'                  6
'2'                  12

Ha hecho lo mismo, en 5 pasos, contra los 8 que me arroja el algoritmo que
me pasaste. 

Y aquí me quedo, no encuentro forma de cómo optimizar la cantidad de pasos.
Creo que lo que me pasaste es la parte inicial, pero debo hacer algo más por
lo visto.

Te vuelvo agradecer por tu respuesta, y espero que puedas revisar esto que
te indico.

Una vez que quede definido el algoritmo, lo implemento en c++ y lo comparto
con la lista, este problema me está dando dolor de cabeza.

Saludos
Diego Alvarado.

El 16 de junio de 2011 05:46, jagse <jagse en intercomgi.com> escribió:

Hola de nuevo:

 

PERDONA, ME HE EQUIVOCADO. 

 

Realmente lo que se ha de hacer es de dividir sucesivamente

el número ingresado por dos hasta que el cociente sea inferior a 2. El
número de veces que lo has

dividido por dos es el numero de veces que has de pulsar el botón dos..

Una vez obtenidos el nro. de veces que has de duplicar, eleva 2 a ese numero
de veces.

El resultado réstalo al numero ingresado.

LA diferencia que obtengas más 1 (debido a que el contador está en cero y si
multplicas por 2 = 0, se ha

de poner el contador en 1) es el número de veces que has de pulsar el nro 1.

 

 

 

Ejemplo:

 

Numero 34

 

34/2 = 17                      1

17/2 = 8,5                     2

8,5/2 = 4,25                  3

4,25/2=2,125                4

2,125/2=1,0625             5

 

Numero de veces que se ha de pulsar 2 = 5

 

2^5=32

 

34-32=2

 

Numero de veces que se ha de pulsar el 1 = 2 + 1 = 3

 

Verificación:

 

El 1    Visor = 1            1

El 2  , Visor = 2                        1

El 2    Visor = 4                        2

El 2    Visor = 8                        2

El 2    Visor = 16                      4

El 2    Visor = 32                      5

El 1    Visor = 33           2

El 1    Visor = 34           3

 

Espero que, esta vez, te sirva y perdona por mi error anterior.

 

Antonio Gómez

  _____  

De: diegoartesanal en gmail.com [mailto:diegoartesanal en gmail.com] 
Enviado el: jueves, 16 de junio de 2011 7:00
Para: Lista de correo sobre C y C++
Asunto: [C con Clase] Necesito la lógica de este problema (arreglos).

 

Un equipo electronico consta de un visor y dos unicos botones señalados
con 1 y 2 al encender el equipo aparece cero en el visor. si se
oprime el boton 1 el numero que esta en la pantalla
aumenta en 1; mientras que si se oprime el boton 2 ; el número se duplica

Escribir un programa que permita:

a) el ingreso de un numero natural "m"

b) muestre la cantidad de veces que debera apretar el boton 1
y la cantidad de veces que debera presionar el boton 2
para obtener, en la menor cantidad posible de pasos, el numero "m" el en
visor
indique la manera en q debe apretarse los botones.

Si alguno me echa una mano con la lógica del problema( no hace falta el
programa , ni el código en c++), me dará una ayuda.


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2
<http://listas.conclase.net/index.php?gid=2&mnu=FAQ> &mnu=FAQ

 

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110617/c6dc2a7f/attachment.html>


Más información sobre la lista de distribución Cconclase