25/01/2020, 04:56:55 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: Homenaje a aladan
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Número capicúa  (Leído 3554 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Estudiantee
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 423


Ver Perfil
« : 13/05/2015, 14:48:18 pm »

me piden que haga una función para un número capicua.
Yo hago esto pero no sé seguir. Una ayuda? Es en C
#include<stdio.h>
#include<stdlib.h>
int main(void){
int n;
printf("Dime el numero\n");
scanf("%d",&n);
while(n<0){
    printf("Dime el numero\n");
scanf("%d",&n);

}
int k;
k=0;
while(n>=1){
    n=n/10;
    k=k+1;
}printf("numero de cifras: %d\n",k);
En línea

Si alguien me invita a forocoches, se lo agradecería.
ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #1 : 13/05/2015, 19:38:04 pm »

Hola

Y, ¿no te dieron más especificaciones?

¿Cuál es tu idea?


Ya entiendo que intentas hacer, lo pensaré y luego editaré este mensaje.
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #2 : 13/05/2015, 21:27:47 pm »

Para encontrar las cifras del número puedes usar la función módulo.

por ejemplo el número 357

357%10=7   

357-357%10=350

350%100=50

350-350%100=300

300%1000=300

Con eso creo que puedes descomponer en cifras cualquier número y generar el capicua que deseas.

Dentro del spoiler he probado lo anterior en python y funciona bien. Quizás lo puedas entender y lo exportes a C.

Spoiler (click para mostrar u ocultar)



Finalmente el programa terminado dentro del spoiler. (Pero en python)

Spoiler (click para mostrar u ocultar)
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
Estudiantee
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 423


Ver Perfil
« Respuesta #3 : 16/05/2015, 12:27:29 pm »

No lo entiendo, se me da horrible programar :avergonzado:
En línea

Si alguien me invita a forocoches, se lo agradecería.
argentinator
Consultar la FIRMAPEDIA __________________________________________________________________________________________________________________
Administrador
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7.283

Vean mis posts activos en mi página personal


Ver Perfil WWW
« Respuesta #4 : 16/05/2015, 12:31:34 pm »

Para poder programar hace falta que el enunciado del problema sea preciso.
De hecho, esa es la parte más importante de un programa.

ingmarov está adivinando lo que tienes que hacer,
pero yo todavía no entiendo qué es lo que te piden.
En línea

Estudiantee
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 423


Ver Perfil
« Respuesta #5 : 16/05/2015, 12:44:53 pm »

Me pide que haga un programa que al introducir un numero me diga si es capicua o no.
Lo que he pensado es separar sus cifras y comparar la primera con la ultima y asi sucesivamente. Si coinciden sera capicua
En línea

Si alguien me invita a forocoches, se lo agradecería.
Juan Pablo Sancho
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4.677


Ver Perfil
« Respuesta #6 : 16/05/2015, 13:52:44 pm »

Propongo este desastre:(hace mucho tiempo que no toco esto del c).

Spoiler (click para mostrar u ocultar)
Ingmarov y argentinator cuando lo veáis no lloréis mucho  :sonrisa_amplia: :sonrisa_amplia: (tengais benevolencia).
En línea
ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #7 : 16/05/2015, 14:00:53 pm »

Hola

...

ingmarov está adivinando lo que tienes que hacer,
...

Totalmente cierto.  :lengua_afuera:

El consuelo que me queda es que gané experiecia. :cara_de_queso: :cara_de_queso: :cara_de_queso:.

El programa que publiqué, separa las cifras del número introducido y construye un número Capicuá con estas cifras, este número resultante comienza con el número original y termina con su "reflexión".

Me pide que haga un programa que al introducir un numero me diga si es capicua o no.
Lo que he pensado es separar sus cifras y comparar la primera con la ultima y asi sucesivamente. Si coinciden sera capicua

La parte del programa que separa las cifras del núero es:

Lo simplifico un poco y lo comento para que lo entiendas más fácil.

i=0
res=-1
l=num  #num es el número introducido.
m=[]   #Esto es una lista (arreglo) vacío, sirve para almacenar las cifras del número introducido.
f=-1
   while f==-1:
      res=l%10**(i+1) #Esto se traduce como l%pow(10,i+1) es decir, calcula el módulo (resto o residuo) de l(num) y potencias de 10, Ej. 123%pow(10,1)=123%10=3
      if res!=l:              #Si res es diferente de l ("ele" no 1 perdón por eso ). Cuando res=l pasa al bloque "else" y termina el ciclo while. Ej. 123%pow(10,3)=0
         m.append(int(res/(10**i)))   #Arega al arreglo m el resto o residuo dividido entre potencia de 10 que lo convierte a unidades. 20/10=2
         l=l-res    #Le resta el actual residuo para que el siguiente res no lo incluya.
      else:
         m.append(int(res/(10**i)))  #Agrega la última cifra al arreglo m.
         f=0   #Con esto termina el ciclo while
      i=i+1  #Esto es para cambiar los exponentes de las potencias de 10.


Espero te sirva ahora.


Propongo este desastre:(hace mucho tiempo que no toco esto del c).

Spoiler (click para mostrar u ocultar)
Ingmarov y argentinator cuando lo veáis no lloréis mucho  :sonrisa_amplia: :sonrisa_amplia: (tengais benevolencia).


A mí me parece una buena idea. Ha de funcionar muy bien.


Y me parece prácico definir un arreglo de 1000 elementos, porque si me dan un número de mil cifras, a mano (a simple vista) sería difícil decir si es capicuá o no; aunque será mucho trabajo introducir 1000 cifras. Si me dan un número de 20 cifras es fácil decir a simple vista si es capicuá y no necesito programa. :sonrisa_amplia:
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
argentinator
Consultar la FIRMAPEDIA __________________________________________________________________________________________________________________
Administrador
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7.283

Vean mis posts activos en mi página personal


Ver Perfil WWW
« Respuesta #8 : 16/05/2015, 16:33:21 pm »

Bueno, todo depende de cómo se ingresa el número.

Si el número se ingresa como un dato de tipo int, entonces tendrá un número acotado de cifras, dado por la implementación (el compilador),
cuyo tamaño puede saberse a ciencia cierta consultando los valores de la librería limits.h.
Entonces no haría falta un array de 1000 cifras.

Para el caso de enteros de 32 bits, daría valores del orden de los 2000 millones, así que un array de 10 cifras bastaría.

El tipo de datos más grande que existe en C, para números enteros positivos, es uintmax_t, que en general coincide con unsigned long long int, que contiene números del orden de [texx]2^{64}\approx 1.8\times 10^{19} [/texx], que son unas 19 cifras.

-----------

En cualquier caso, no me parece necesario usar arrays para este problema, a menos que los datos vengan ya en forma de un array de dígitos.

Los pasos a dar serían estos:

* Calcular el número de dígitos decimales del número.
* Obtener la primera y última cifra del número y comparar. Hacer lo mismo con las siguientes hasta llegar al centro del número.

No hace falta seguir más allá de las cifras centrales, porque las cifras correspondientes ya estarían comparadas.f

Para obtener la primera cifra, basta dividir por la potencia de 10 más cercana al número.
Para obtener la última cifra, se toma el resto módulo 10.
Para obtener las siguientes cifras, habría que eliminar estas cifras primera y última, para poder aplicar el mismo método a las cifras restantes.

De hecho, una propiedad invariante de un número capicúa es que, si quitamos la primera y la última cifra, el número que queda es también capicúa.
Pero, más importante, si las primera y última cifra coinciden, y si al quitarlas lo que queda es capicúa, es que el número original era capicúa.
Ejemplo:

17871

La primera y última cifra son iguales a 1, y al quitarlas nos queda el número capicúa 787.
Esto implica que el número original 17871 era ya capicúa.

Con esta propiedad invariante, podemos pensar un algoritmo, así:


/* CAPICUA

   Entrada: Un número entero n
   Salida:  Informar si el número n es capicúa o no.
   Método:  Iteraciones, sin almacenar las cifras en memoria adicional.
*/

#include <math.h>
#include <stdio.h>

int main(void)
{
  int n;
  printf("Ingrese un numero entero: ");
  scanf("%d", &n);

  /* Por defecto, asumiremos que el número es capicua,
     a menos que se detecte lo contrario.
     La variable capicua será 1 (verdadero) mientras
     "todavía no se haya detectado que n no es capicua".
     Si al final del proceso sigue siendo 1,
     es que n efectivamente era capicúa.
  */

  int capicua = 1;

  int digitos = log10(n) + 1;
  int pow10 = round(pow(10, digitos-1)); /* Potencia de 10 inferior más cercana a n */
  int nn = n; /* Copiamos n en nn para modificarlo sin perder valor original */
  while (pow10 > 0)
  {
    /* capicua == 1: El número nn todavía no se ha detectado como no-capicúa */

    int primer_cifra = nn / pow10;
    int ultima_cifra = nn % 10;

    if (primer_cifra != ultima_cifra) /* Se detecta que nn no es capicúa */
    {
      capicua = 0; /* Valor falso */
      break;       /* Fin del proceso, no hay nada más que verificar */
    }
    /* En este punto vale la condición primer_cifra == ultima_cifra */

    /* A continuación, quitamos la primer y última cifra, achicando nn */
    nn -= primer_cifra * pow10;
    nn /= 10;   /* La división entera por 10 quita la última cifra */
    /* INVARIANTE del proceso:
          n es capicua si y sólo si primer_cifra == ultima_cifra y nn es capicúa
    */

    /* Como hemos quitado dos cifras, la potencia de 10 más cercana
       del siguiente valor de nn será pow10 / 100
    */
    pow10 /= 100;
  }

  printf("El numero %d %s capicua", n, capicua? "es": "no es");
  return 0;
}


En línea

ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #9 : 16/05/2015, 22:33:15 pm »

Genial! Es bueno leer códigos distintos para resolver un problema, se aprende mucho.

Spoiler (click para mostrar u ocultar)

Bueno, todo depende de cómo se ingresa el número.
...



...

  int digitos = log10(n) + 1;
  int pow10 = round(pow(10, digitos-1)); /* Potencia de 10 inferior más cercana a n */
...




Perdonen mi abuso argentinator y Estudiantee, es que tengo un par de dudas (y no he sido yo quien inició el hilo).  :lengua_afuera:

Cuando defines la variable digitos como entero y le asignas el logaritmo de base 10 de "n" más uno (generalmente un número tipo float) ¿Qué hace C? lo convierte en entero, o da un error.  Es que hace bastante tiempo no uso C y he olvidado mucho.

Y lo otro la variable "digitos" solo la utilizas una vez y cuando la utilizas le restas 1, entonces ¿al definirla no era necesario sumarle 1, o me equivoco?

Saludos amigo y gracias de antemano.
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
argentinator
Consultar la FIRMAPEDIA __________________________________________________________________________________________________________________
Administrador
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7.283

Vean mis posts activos en mi página personal


Ver Perfil WWW
« Respuesta #10 : 17/05/2015, 03:44:56 am »

Lo que hace C es convertir punto flotante a entero por truncamiento.
Para evitar efectos indeseados le apliquè un redondeo, que ahora me deja el valor correcto aunque aun en punto flotante.

La variable digitos significa la cantidad de digitos.
Si le resto 1 al momento de definirla, el programa pierde legibilidad, mientras que la eficiencia es la misma.
En línea

ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #11 : 17/05/2015, 11:13:45 am »

Lo que hace C es convertir punto flotante a entero por truncamiento.
Para evitar efectos indeseados le apliquè un redondeo, que ahora me deja el valor correcto aunque aun en punto flotante.

La variable digitos significa la cantidad de digitos.
Si le resto 1 al momento de definirla, el programa pierde legibilidad, mientras que la eficiencia es la misma.

Todo entendido, muchas gracias.

Sobre la segunda respuesta, ya otro forísta (luis de Uruguay) me había mencionado sobre la legibilidad, que,en programacion, no se deben hacer las cosas simplemente porque se puede, se debe garantizar que otros puedan leer el programa con la mayor facilidad. Tengo mucho que aprender.

Gracias de nuevo.
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
argentinator
Consultar la FIRMAPEDIA __________________________________________________________________________________________________________________
Administrador
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7.283

Vean mis posts activos en mi página personal


Ver Perfil WWW
« Respuesta #12 : 17/05/2015, 11:17:09 am »

Hay que buscar un equilibrio entre legibilidad y eficiencia.
Si es muy ineficiente, hay que reformular el programa.

Además, estudiantee pidió una función que resuelva el problema, y yo hice todo adentro de main().
Habría que hacer una función llamada capicua(), que devuelva 1 ó 0 según que el número pasado como parámetro sea capicúa o no.

Para lograr esta modularidad uno tiene que pensar separadamente de entrada en poner por un lado los datos de entrada, luego el proceso o solución sin usar print() ni scanf(), y finalmente exhibir la solucion en pantalla.
En línea

ingmarov
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Honduras Honduras

Mensajes: 4.438



Ver Perfil
« Respuesta #13 : 17/05/2015, 11:27:41 am »

...

Además, estudiantee pidió una función que resuelva el problema, y yo hice todo adentro de main().
Habría que hacer una función llamada capicua(), que devuelva 1 ó 0 según que el número pasado como parámetro sea capicúa o no.
...

Quizás cuando leíste el código escrito por Estudiantee, pensaste que él aun no entendía la definición de función y querías garantizar que el programa que escribes pueda ser leído y entendido por Estudiantee, y por eso pusiste todo dentro de main().
En línea

No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...
Estudiantee
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 423


Ver Perfil
« Respuesta #14 : 17/05/2015, 13:01:16 pm »

Gracias a todos por vuestras respuestas :sonrisa_amplia:
En línea

Si alguien me invita a forocoches, se lo agradecería.
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!