Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Revirtiendo un número con función pow

Estas en el tema de Revirtiendo un número con función pow en el foro de C/C++ en Foros del Web. Hola estimados, ¿Cuál puede ser el error? Este código revierte un número de cinco cifras, excepto por la última cifra, la cual disminuye en 1. ...
  #1 (permalink)  
Antiguo 31/08/2014, 21:14
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Revirtiendo un número con función pow

Hola estimados,
¿Cuál puede ser el error? Este código revierte un número de cinco cifras, excepto por la última cifra, la cual disminuye en 1.

Código:
#include <math.h> 
#include <stdio.h> 
void main( void ) 
{ 
    int numero, contador = 0, ultima_cifra, revertido = 0; 
    printf( "Por favor tipea un numero de cinco cifras y yo lo revertire\n" ); 
    scanf( "%d", &numero ); 
    for( contador = 4; contador >= 0; contador-- ) 
    { 
        ultima_cifra = numero% 10; 
        numero = numero / 10; 
        revertido = revertido + ultima_cifra * pow( 10, contador ); 
    }
    printf( "El numero revertido es %d", revertido ); 
}

EJECUCIONES DE EJEMPLO
Por favor tipea un numero de cinco cifras y yo lo revertire
12345
El numero revertido es 54320

Por favor tipea un numero de cinco cifras y yo lo revertire
98765
El numero revertido es 56788
  #2 (permalink)  
Antiguo 31/08/2014, 21:49
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Revirtiendo un número con función pow

Hola Virtualforos.

Creo que estas complicando la solución con el uso innecesario de la función pow, es mas simple hacer:
Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. int main() {
  4.   int num, inv;
  5.   printf("Por favor tipea un numero y lo revertire\n");
  6.   scanf("%d", &num);
  7.   while(getchar() != '\n');
  8.  
  9.   /* invertir el numero */
  10.   for(inv = 0; num > 0; num /= 10)
  11.     inv = inv * 10 + num % 10;
  12.  
  13.   printf("El numero revertido es %d", inv);
  14.   getchar();
  15.   return 0;
  16. }

Saludos.
  #3 (permalink)  
Antiguo 31/08/2014, 22:19
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Revirtiendo un número con función pow

Cita:
Iniciado por ecfisa Ver Mensaje
Hola Virtualforos.

Creo que estas complicando la solución con el uso innecesario de la función pow, es mas simple hacer:
Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. int main() {
  4.   int num, inv;
  5.   printf("Por favor tipea un numero y lo revertire\n");
  6.   scanf("%d", &num);
  7.   while(getchar() != '\n');
  8.  
  9.   /* invertir el numero */
  10.   for(inv = 0; num > 0; num /= 10)
  11.     inv = inv * 10 + num % 10;
  12.  
  13.   printf("El numero revertido es %d", inv);
  14.   getchar();
  15.   return 0;
  16. }

Saludos.
Gracias ecfisa,
me gustó mucho tu código, es sencillo y logra perfectamente el objetivo, además funcionaría con un número de cualquier longitud. Sin embargo, se supone que el ejercicio lo tengo que solucionar con la función pow, lo cual me lleva a romperme la cabeza intentado encontrar el error. ¿Cuál será?
  #4 (permalink)  
Antiguo 01/09/2014, 00:33
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Revirtiendo un número con función pow

He probado el programa, tal como lo tienes, y me funciona perfectamente. Tampoco le he encontrado posibles causas de error, siempre que te ciñas a 5 cifras.
  #5 (permalink)  
Antiguo 01/09/2014, 02:27
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Revirtiendo un número con función pow

Creo que el problema lo tienes aquí:
Código C++:
Ver original
  1. revertido = revertido + ultima_cifra * pow( 10, contador );

La función pow() retorna un double, y tú lo estas multiplicando por un int. En esa parte pierdes la precisión que luego te provoca el error. Lo puedes comprobar imprimiendo el valor de revertido en cada iteración del bucle.
Puedes arreglarlo así:
Código C++:
Ver original
  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. int main( void )
  5. {
  6.     int numero, contador = 0, ultima_cifra, revertido = 0;
  7.     double parcial=0;
  8.     printf( "Por favor tipea un numero de cinco cifras y yo lo revertire\n" );
  9.     scanf( "%d", &numero );
  10.     for( contador = 4; contador >= 0; contador-- )
  11.     {
  12.         ultima_cifra = numero% 10;
  13.         numero = numero / 10;
  14.         parcial = pow( 10, contador);
  15.         revertido = revertido +ultima_cifra* parcial;
  16.     }
  17.     printf( "El numero revertido es %d", revertido );
  18. }

Saludos!
  #6 (permalink)  
Antiguo 02/09/2014, 20:04
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Revirtiendo un número con función pow

Cita:
Iniciado por dehm Ver Mensaje
Creo que el problema lo tienes aquí:
Código C++:
Ver original
  1. revertido = revertido + ultima_cifra * pow( 10, contador );

La función pow() retorna un double, y tú lo estas multiplicando por un int. En esa parte pierdes la precisión que luego te provoca el error. Lo puedes comprobar imprimiendo el valor de revertido en cada iteración del bucle.
Puedes arreglarlo así:
Código C++:
Ver original
  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. int main( void )
  5. {
  6.     int numero, contador = 0, ultima_cifra, revertido = 0;
  7.     double parcial=0;
  8.     printf( "Por favor tipea un numero de cinco cifras y yo lo revertire\n" );
  9.     scanf( "%d", &numero );
  10.     for( contador = 4; contador >= 0; contador-- )
  11.     {
  12.         ultima_cifra = numero% 10;
  13.         numero = numero / 10;
  14.         parcial = pow( 10, contador);
  15.         revertido = revertido +ultima_cifra* parcial;
  16.     }
  17.     printf( "El numero revertido es %d", revertido );
  18. }

Saludos!
Dehm,
funciona! Siguiendo tu consejo de imprimir el valor de "revertido" imprimí todas las variables, está pasando algo... muy extraño

Código:
#include <math.h>
#include <stdio.h>
void main( void )
{
    int numero, contador = 0, ultima_cifra, revertido = 0;
    printf( "Por favor tipea un numero de cinco digitos y yo lo revertire\n" );
    scanf( "%d", &numero );
    for( contador = 4; contador >= 0; contador-- )
    {
        ultima_cifra = numero % 10;
        numero = numero / 10;
        printf( "%d %d %f %f\n\n", revertido, ultima_cifra, pow( 10, contador ), revertido + ultima_cifra * pow( 10, contador ));
        revertido = revertido + ultima_cifra * pow( 10, contador );
    }
    printf( "El numero revertido es %d", revertido );
}
EJECUCIÓN DE EJEMPLO
Por favor tipea un numero de cinco digitos y yo lo revertire
12345
0 5 10000.000000 50000.000000
49999 4 1000.000000 53999.000000
53999 3 100.000000 54299.000000
54299 2 10.000000 54319.000000
54319 1 1.000000 54320.000000
El numero revertido es 54320


De esto extraigo que el problema ocurre cuando se le asigna por primera vez este 50000.000000 a revertido: PIERDE una unidad! Y lo más loco de todo, es que solo ocurre en el primer recorrido del for (en la primera asignación). En las subsiguientes asignaciones no se pierde ninguna unidad. ¿Que raro no? ¿Alguna explicación?

PD: ¿Cómo se hace para postear el código con formato C++, como lo hacen ustedes?
  #7 (permalink)  
Antiguo 02/09/2014, 22:02
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: Revirtiendo un número con función pow

Hola Virtualforos.

No noto nada extraño, cuando la variable revertido muestra el valor cero es por que aún no se le ha asignado otro valor que el de inicialización.
Sólo cambia el órden de las líneas de este modo:
Código C:
Ver original
  1. ...
  2.   revertido = revertido + ultima_cifra * (int)pow(10,contador );
  3.   printf( "%d %d %f %f\n\n", revertido, ultima_cifra, pow( 10, contador ), revertido + ultima_cifra * pow( 10, contador ));
  4. ...
y aparecerá la unidad perdida.

En cuanto a las etiquetas de formato, fijate que en la parte superior derecha del editor de mensajes hay un combo que por defecto tiene la palabra "Highlight", desplega el combo y selecciona entre las diferentes opciones (entre las que figuran C y C++).

Como dato adicional si el requisito es usar funciones de la librería math, igualmente podes trabajar con numeros de longitud variable. Para obtener la cantidad de dígitos de un número podes hacer:
Código C:
Ver original
  1. ...
  2.   int numero, nrodigitos;
  3.   // leer numero
  4.   nrodigitos = (int)log10(numero)+1;
  5. ...

Saludos.
  #8 (permalink)  
Antiguo 03/09/2014, 12:49
 
Fecha de Ingreso: octubre-2008
Mensajes: 66
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Revirtiendo un número con función pow

Pues resulta ser que que al asignar a "revertido"(int) un valor double, este pierde precisión, la opción que se me ocurrió fue simplemente declarar a "revertido" como double.
Código C:
Ver original
  1. #include <math.h>
  2. #include <stdio.h>
  3. void main( void )
  4. {
  5.     int numero, contador = 0, ultima_cifra;
  6.     double revertido = 0;
  7.     printf( "Por favor tipea un numero de cinco digitos y yo lo revertire\n" );
  8.     scanf( "%d", &numero );
  9.     for( contador = 4; contador >= 0; contador-- )
  10.     {
  11.         ultima_cifra = numero % 10;
  12.         numero = numero / 10;
  13.         revertido = revertido + ultima_cifra * pow( 10, contador );
  14.     }
  15.     printf( "El numero revertido es %.0f", revertido );
  16. }

Última edición por Virtualforos; 06/09/2014 a las 20:22

Etiquetas: ejemplo, int, pow
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:32.