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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
[C][?] Duda con algoritmo en C
« en: 30 Mayo 2019, 12:49 pm »

Buenas a todos, soy nuevo en el foro y en esto de la programación, y tengo una duda con un algoritmo en C. Encontré un ejercicio que no se muy bien como tratar y que consiste en diseñar una función que reciba un número entero positivo y devuelva la cifra i-ésima de este. La función posee el prototipo "int cifra_iesima(int n, int i)" siendo "n" el número e "i" la cifra que solicito que me devuelva la función. He probado de distintas maneras, pero no logro dar con la solución, además he creado una función auxiliar que calcula el número de cifras que posee el número, el cual introduzco por teclado. Mi código es el siguiente:
Código:

#include <stdio.h>

int numero_cifras(int n);

int cifra_iesima(int n, int i);

int main() {
    int n, i = 0;
    printf("\n Introduce un n%cmero entero: ", 163);
    scanf("%d", &n);
    if(n < 0) {
        n = -n;
    }
    while(i < numero_cifras(n)) {
        printf(" i = %d --> cifra = %d\n", i, cifra_iesima(n, i));
        i++;
    }
    return 0;
}

int numero_cifras(int n) {
    int contador = 1;
    n = n / 10;
    while(n != 0) {
        contador++;
        n = n / 10;
    }
    return contador;
}

int cifra_iesima(int n, int i) {
   
}

¿Alguna idea?


En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C][?] Duda con algoritmo en C
« Respuesta #1 en: 30 Mayo 2019, 13:22 pm »

Hola,

Una posibilidad sería pasar el número a una cadena y así luego simplemente devuelves la posición que te interese. Hace mucho que no toco C pero sería algo así (no lo he probado por lo que igual hay algún error):

Código
  1. int cifra_iesima(int n, int i)
  2. {
  3.    char buffer[64] = "";
  4.  
  5.    sprintf(buffer, "%d", n);
  6.  
  7.    // Si n negativo, la cifra correcta es i+1 para tener
  8.    // en cuenta el símbolo '-'
  9.    int index = n >= 0 ? i : i+1;
  10.  
  11.    // 48 = Código ASCII decimal para el 0
  12.    return buffer[index]-48;
  13. }

Ten en cuenta que aquí considero que la primera cifra tiene el índice 0. Si quisieras que empezara a contar en el índice 1, deberías restarle uno a la variable index.

Saludos!




En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C][?] Duda con algoritmo en C
« Respuesta #2 en: 30 Mayo 2019, 13:34 pm »

Para hacer ese ejercicio con lo que ya tienes solo necesitas esto:
Código
  1. while(numero > 0){
  2.    ultima_cifra = numero % 10;
  3.    numero /= numero;
  4. }
Eso de ahí va sacando la última cifra de un número. Ahora adapta eso a lo que necesitas tú.
Suerte :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
doSomething()

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: [C][?] Duda con algoritmo en C
« Respuesta #3 en: 30 Mayo 2019, 13:40 pm »

Gracias xiruko e Yrex-DwX por las respuestas. Justo hace unos segundos he conseguido dar con una solución usando la división y el módulo, tal y como has indicado Yrex. La función es esta:
Código:
int cifra_iesima(int n, int i) {
    int cifra_iesima = 0, aux = 1, div = 1;
    if(i < numero_cifras(n)) {
        while(aux <= i) {
            div = div * 10;
            aux++;
        }
        if(aux == numero_cifras(n)) {
            cifra_iesima = n / div;
        }
        else {
            cifra_iesima = n / div % 10;
        }
    }
    return cifra_iesima;
}
¿Alguna forma de simplificarlo aún más?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: [C][?] Duda con algoritmo en C
« Respuesta #4 en: 30 Mayo 2019, 17:58 pm »

Te dejo un par de funciones para calcularlo sin iteraciones, es decir, sin bucles. Seguro que también se puede hacer con bucles de una forma más sencilla que la que tienes implementada, por si te apetece intentarlo.
Código
  1. // Calcula la cifra i-esima empezando a contar por la derecha
  2. unsigned cifraIesimaBack(unsigned numero, unsigned cifra){
  3. unsigned cifra_iesima = (numero % int(pow(10, cifra))) / pow(10, cifra-1);
  4. return cifra_iesima;
  5. }
  6.  
  7. // Calcula la cifra i-esima empezando a contar por la izquierda
  8. unsigned cifraIesimaFront(unsigned numero, unsigned cifra){
  9. unsigned cifra_iesima = numero / int(pow(10, numeroDigitos(numero)-cifra)) % 10;
  10. return cifra_iesima;
  11. }
  12.  
  13. // Calcula el numero de digitos que tiene un numero
  14. unsigned numeroDigitos(unsigned numero){
  15. unsigned digitos = (numero != 0); // esto considera que el 0 tiene 0 digitos. Para considerar que tiene 1 digito, inicializar en 1
  16. while(numero > 9){
  17. numero /= 10;
  18. digitos++;
  19. }
  20. return digitos;
  21. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Python - Duda Algoritmo
Scripting
h0oke 7 4,984 Último mensaje 30 Marzo 2010, 03:12 am
por h0oke
Duda Algoritmo de Ordenamiento
Programación General
kernel19 4 3,443 Último mensaje 27 Diciembre 2010, 16:54 pm
por BgCRaCK
duda con algoritmo
Programación General
z_ane_666 1 2,739 Último mensaje 5 Mayo 2011, 23:40 pm
por Valkyr
Duda con algoritmo facil
Ejercicios
NachoEx 2 3,787 Último mensaje 6 Marzo 2013, 21:46 pm
por NachoEx
duda algoritmo
Programación C/C++
Beginner Web 4 1,830 Último mensaje 8 Junio 2019, 21:55 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines