elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejercicio de monedas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejercicio de monedas  (Leído 2,689 veces)
spf9

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ejercicio de monedas
« en: 3 Enero 2015, 12:02 pm »

Hola,
tengo que hacer un ejercicio en C++ que lee una secuencia de números (monedas) todas iguales menos una. Me tiene que decir el indice de la moneda que pesa diferente precedido de + o - dependiendo de si pesa mas o menos que el resto.

Para la entrada:
7
9 9 9 9 10 9 9
Tengo que obtener la salida: +4

He hecho la siguiente función que compara dos segmentos de la secuencia y devuelve 0 si pesan lo mismo, 1 si el primero pesa más o -1 si pesa más el segundo:

int pesa(int v[], int ia, int ib, int n) {
   int t = 0;

   for (int i = 0; i < n; i++)
      t += (v[ib+i] - v[ia+1]);

   return t ? (t < 0? - 1:1) : 0;
}

Me falta hacer una función recursiva que, mediante llamadas a la funcion pesa(), se quede con el elemento que pesa diferente. Ahí es donde ando un poco perdido. Agradecería cualquier ayuda.


En línea

Orubatosu


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: Ejercicio de monedas
« Respuesta #1 en: 3 Enero 2015, 12:42 pm »

Si es como estoy pensando, en realidad solo tienes que hacer un bucle.

Primero, haces una comparación entre 3 unidades, las dos que sean iguales son las "iguales".

Luego haces un bucle buscando una que no sea igual, y lo tienes ya.

En el primer caso tienes 3 opciones, la 1 y 3 son iguales, o la 1 y 2 o la 2 y 3. El valor restante es el que buscas.

Luego simplemente recorre la secuencia almacenada buscando ese valor.


En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Ejercicio de monedas
« Respuesta #2 en: 4 Enero 2015, 02:51 am »

Bueno, tengo una idea más o menos parecida.

Comparas las dos primeras. Si son distintas entonces una de ellas es "igual" a todas las demás, y la otra es la "distinta". Para dilucidar, debes revisar el tercer valor.

Si las dos primeras son iguales, pues buscas de la 3ra en adelante la primera que sea distinta y ya.

Ojo, sólo funcionará si el array tiene los valores correctamente: todos iguales y uno desigual.

Código
  1. int distinto( int *x, int N) {
  2.  
  3. int i;
  4.  
  5. if ( N < 3 ) return -1;
  6.  
  7. if ( x[0] == x[1] ) { /* los dos primeros iguales */
  8. /* repetir desde el tercero en adelante, mientras
  9. * sea igual al primero */
  10. for ( i = 2; i < N && x[i] == x[0]; i++ )
  11. ;
  12. if ( i < N )
  13. return x[i] > x[0] ? i: -i;
  14. else
  15. return -1;
  16. }
  17. else /* los dos primeros distintos, revisar el tercero */
  18. if ( x[0] == x[2] )
  19. return x[1] > x[0] ? 1 : -1;
  20. else
  21. return 0;
  22. }

Esta función la acabo de probar y me funcionó bien en todas las combinaciones.

OBSERVACIONES: (1) Si el distinto es el primero, devuelve el índice cero (no tiene signo). De otro modo, devuelve + o - según el caso.
(2) Si todos los elementos son iguales, o tiene menos de tres elementos, devuelve -1 (condición de error, jeje).
« Última modificación: 4 Enero 2015, 02:53 am por yoel_alejandro » En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ejercicio de monedas
« Respuesta #3 en: 9 Enero 2015, 04:09 am »

Una implementación ligeramente distinta que funciona correctamente siempre y cuando la entrada sea valida y con la misma limitante que ya indico yoel_alejandro (el cero negativo) es:
Código
  1. int fn(int const a[])
  2. {
  3.   int i;
  4.  
  5.   for (i = 1; a[i] == a[0]; i++)
  6.      ;
  7.   if (i == 1)
  8.      i = a[0] == a[2];
  9.  
  10.   return a[i] - a[!i] > 0 ? i : -i;
  11. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Acertijo Monedas « 1 2 »
Desafíos - Wargames
TheMaker 12 15,513 Último mensaje 17 Febrero 2011, 20:48 pm
por likinhell
Telefonos de monedas
Hacking
NIGHTCRAWLERR2D2 5 6,332 Último mensaje 17 Diciembre 2009, 22:28 pm
por Martin-Ph03n1X
Problemas con el vuelto en monedas « 1 2 »
Programación C/C++
adripillo14 13 7,078 Último mensaje 5 Noviembre 2012, 23:03 pm
por xiruko
Cambio en billetes y monedas en C++
Programación C/C++
AxelP 7 14,876 Último mensaje 2 Octubre 2014, 15:44 pm
por rir3760
El valor de las monedas digitales « 1 2 »
Foro Libre
Ali Baba 10 7,004 Último mensaje 14 Mayo 2017, 17:34 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines