Numero al azar capicua

Iniciado por emilioFIE, 15 Junio 2020, 16:40 PM

0 Miembros y 1 Visitante están viendo este tema.

emilioFIE

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!!!!

K-YreX

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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

emilioFIE

#2
esto tengo hasta el momento

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int capicua();
int main()
{
   int num;
   printf("El numero es: %d\n",capicua());
   return 0;
}

int capicua()
{
   int num,u,d,c,um,dm;
   srand(time(0));
   do
       {
         num = (rand()%99999-10000+1)+10000;
         u=num%10;
         d=num/10%10;
         c=num/100%10;
         um=num/1000%10;
         dm=num/10000;
       } while  (u==dm&&d==um);

  return num;
}

K-YreX

#3
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:

int generarAleatorio(int minimo, int maximo){ // Devuelve un numero aleatorio en el rango [minimo, maximo]
 srand(time(NULL)); // NULL es equivalente a 0. Lo puedes hacer aqui o antes de llamar a la funcion
 int numero = minimo + rand() % (maximo - minimo + 1);
 return numero;
}


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:

int numero = generarAleatorio(100, 999);
int penultimoDigito = (numero / 10) % 10;
int ultimoDigito = numero / 100;
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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

emilioFIE

Cita de: YreX-DwX 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:

int generarAleatorio(int minimo, int maximo){ // Devuelve un numero aleatorio en el rango [minimo, maximo]
  srand(time(NULL)); // NULL es equivalente a 0. Lo puedes hacer aqui o antes de llamar a la funcion
  int numero = minimo + rand() % (maximo - minimo + 1);
  return numero;
}


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:

int numero = generarAleatorio(100, 999);
int penultimoDigito = (numero / 10) % 10;
int ultimoDigito = numero / 100;
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