Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: emilioFIE en 15 Junio 2020, 16:40 pm



Título: Numero al azar capicua
Publicado por: emilioFIE en 15 Junio 2020, 16:40 pm
Hola!!! Necesito ayuda con este ejercicio:

Programar una funcion que retorne un numero generado al azar de 5 digitos que cumpla con la condicion de ser capicua. Llame  esta funcion desde el main y mostrar en pntalla el numero devuelto por la misma.

gracias!!!!


Título: Re: Numero al azar capicua
Publicado por: K-YreX en 15 Junio 2020, 17:21 pm
Lo que tienes que tener en cuenta para que el número sea capicúa es que las cifras 4 y 5 sean iguales a la 2 y 1 respectivamente.
Por lo tanto puedes generar 3 dígitos al azar (los 3 primeros) y los 2 últimos siempre tendrás que obtenerlos en base a los 2 primeros dígitos generados antes aleatoriamente.

Si necesitas ayuda con el código en concreto, incluye el código que tengas hasta el momento entre etiquetas de Código GeSHi.
No se hacen tareas.


Título: Re: Numero al azar capicua
Publicado por: emilioFIE en 15 Junio 2020, 17:27 pm
esto tengo hasta el momento
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. int capicua();
  6. int main()
  7. {
  8.    int num;
  9.    printf("El numero es: %d\n",capicua());
  10.    return 0;
  11. }
  12.  
  13. int capicua()
  14. {
  15.    int num,u,d,c,um,dm;
  16.    srand(time(0));
  17.    do
  18.        {
  19.          num = (rand()%99999-10000+1)+10000;
  20.          u=num%10;
  21.          d=num/10%10;
  22.          c=num/100%10;
  23.          um=num/1000%10;
  24.          dm=num/10000;
  25.        } while  (u==dm&&d==um);
  26.  
  27.   return num;
  28. }
  29.  


Título: Re: Numero al azar capicua
Publicado por: K-YreX en 15 Junio 2020, 18:49 pm
Uff, ese código es puro azar. Generas números aleatorios hasta que coincide que uno es capicúa. Además lo hace al revés. Según ese do while() lo que haces es generar números hasta que uno no es capicúa. La condición del while() es para que se repita, tendría que ser: (u != dm || d != um).

Lo suyo sería asegurar que es capicúa como te decía antes. Veamos:
Para empezar te vendría bien una función:
Código
  1.  
  2. int generarAleatorio(int minimo, int maximo){ // Devuelve un numero aleatorio en el rango [minimo, maximo]
  3.  srand(time(NULL)); // NULL es equivalente a 0. Lo puedes hacer aqui o antes de llamar a la funcion
  4.  int numero = minimo + rand() % (maximo - minimo + 1);
  5.  return numero;
  6. }

Y ahora creas un número aleatorio de 3 cifras. Lo más fácil es que crees los 3 primeros dígitos y agregues los 2 últimos después:
Código
  1. int numero = generarAleatorio(100, 999);
  2. int penultimoDigito = (numero / 10) % 10;
  3. int ultimoDigito = numero / 100;
  4. numero = numero * 100 + penultimoDigito * 10 + ultimoDigito;

Al final esa variable <numero> (si no me equivoco) contendrá siempre un número de 5 cifras capicúa.
Se puede hacer mejor, no hay duda, pero de esta manera ves cuál ha sido el procedimiento a seguir.


Título: Re: Numero al azar capicua
Publicado por: emilioFIE en 15 Junio 2020, 20:48 pm
Uff, ese código es puro azar. Generas números aleatorios hasta que coincide que uno es capicúa. Además lo hace al revés. Según ese do while() lo que haces es generar números hasta que uno no es capicúa. La condición del while() es para que se repita, tendría que ser: (u != dm || d != um).

Lo suyo sería asegurar que es capicúa como te decía antes. Veamos:
Para empezar te vendría bien una función:
Código
  1.  
  2. int generarAleatorio(int minimo, int maximo){ // Devuelve un numero aleatorio en el rango [minimo, maximo]
  3.  srand(time(NULL)); // NULL es equivalente a 0. Lo puedes hacer aqui o antes de llamar a la funcion
  4.  int numero = minimo + rand() % (maximo - minimo + 1);
  5.  return numero;
  6. }

Y ahora creas un número aleatorio de 3 cifras. Lo más fácil es que crees los 3 primeros dígitos y agregues los 2 últimos después:
Código
  1. int numero = generarAleatorio(100, 999);
  2. int penultimoDigito = (numero / 10) % 10;
  3. int ultimoDigito = numero / 100;
  4. numero = numero * 100 + penultimoDigito * 10 + ultimoDigito;

Al final esa variable <numero> (si no me equivoco) contendrá siempre un número de 5 cifras capicúa.
Se puede hacer mejor, no hay duda, pero de esta manera ves cuál ha sido el procedimiento a seguir.

Muchas gracias ahora si!!!!  :D