Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lohayne en 20 Abril 2018, 02:25 am



Título: invertir el número entero
Publicado por: lohayne en 20 Abril 2018, 02:25 am
Hola
Hola buenas tardes,
Estoy haciendo un ejercicio para invertir un número (un número de la elección del usuario)
ejemplo: 1234 se convierte en 4321
pero a pesar de que el programa se ejecuta, cuando pongo 3 dígitos o más, los números aparecen invertidos, pero falta 1 dígito
¿Alguien me puede ayudar?




Olá boa tarde,
Eu estou fazendo um exercício para inverter um numero(um numero da escolha do usuário)
exemplo:1234 vira 4321
mas apesar do programa rodar,quando eu coloco 3 dígitos ou mais  ,os números aparecem invertidos ,mas o ultimo digito não aparece
alguém poderia me ajudar?
 
 
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main() {
  5.    int n,cifra,i;
  6.    int *v;
  7.     v =(int*) malloc (n*sizeof(int));
  8.    printf("escriba un numero:");
  9.    scanf("%i",&n);
  10.    for (i=0;i<n;i++) {
  11.    cifra=n%10;
  12.    n=n/10;
  13.    v=cifra;
  14.    printf("%i",v );}
  15.    return 0;}
  16.  


· Los códigos deben ir en etiquetas GeSHi (corregido)
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: invertir el número entero
Publicado por: engel lex en 20 Abril 2018, 02:42 am
tienes un problema logico en tu operación

Código
  1. for (i=0;i<n;i++) {
  2.    cifra=n%10;
  3.    n=n/10;
  4.    v=cifra;
  5.    printf("%i",v );
  6. }

primera linea: para i empezando en 0, mientras que i sea menor que n

en este caso si el numero por ejemplo es 118

Código:
ciclo1:
i=0
cifra = 8
n = 11
v = 8
imprime 8
-------
ciclo2:
i=1
cifra = 1
n = 1
v = 1
imprime 1
-------
ciclo:
i = 2.... n en el ciclo2 era 1 por lo tanto al ser 2>1 se rompe el for

el codigo deben cambiar la linea del for por

Código
  1. while(n){

esto hará que se repita mientras que n no sea 0(que será interpretado como false y terminará el codigo)...


por otro lado aunque no te afecta realmente, tienes una incoherencia con ese puntero a v no tiene mucho sentido


Título: Re: invertir el número entero
Publicado por: Serapis en 20 Abril 2018, 02:54 am
Tienes un error semántico...

Usas el bucle incorrecto al caso. Para usar un bucle "For", se debe saber cuantas veces debe ejecutarse. Cuando se desconoce cuantas veces deba ejecutarse un bucle, es mejor usar un bucle incondiional tipo "while..."

Tu usas i como contador, pero 'i', nada tiene que ver con el valor que introduce el usuario (por ejemplo 34567), con cada ciclo, n pierde un dígito, e 'i' suma 1, luego cuando 'n' solo qued euna cifra... el resultado dependerá de si 'i' se ha ejecutado menos veces que el valor de 'n' que resta...

La solución es modificar el bucle así:

Código:
Hacer mientras (n>0)
   imprimir (n modulo 10)
   n = (n\10)
repetir

Si fuera el caso que hubiera ceros a la izquierda, como número los ceros a la izquierda, no valen nada (00053 = 53, luego la inversión del número 0053 = 35 es correcta)...
...pero si lo tomas como si fuera texto, si cuentan ("0053" invertido sería "3500", pero en ese caso 'n' no podría ser tratado cono un número y el módulo y la división darían error, es decir la función debería ser otra distinta, operando con caracteres y no con cifras.



Título: Re: invertir el número entero
Publicado por: Kenji-chan en 20 Abril 2018, 03:48 am
la resolución de este problema es sencilla
primero tienes que averiguar la cantidad de dígitos que tiene el numero ingresado

Código:
num = numero ingresado por el usuario;
digitos = 0;
aux = 1;

mientras aux < num hacer:
    digitos = digitos + 1;
    aux = aux * 10;
con esto obtenemos la cantidad de dígitos que tiene el numero
ahora hay que voltear el numero para ello tenemos que descomponer el numero
Código:
//para el ejemplo usaremos el numero 1234
inverso = 0
parte = num/valor_proposicional //El valor posiciona es el valor que toma un dígito de acuerdo con la posición que ocupa dentro del número (unidades, decenas, centenas…)
/*parte = 1234/1000*/
inverso = inverso + (parte * valor_proposicional) en este caso el valor_proposicional sera la nueva posiciona que le estemos dando
/*inverso = 0 +(1 * 1)*/
y si repetimos el proceso iremos re posicionando los dígitos del numero
pero para ello tenemos que cambiar el valor de nuestro numero

Código:
num = num%valor_proposicional
/* num = 1234%1000
esto nos devolverá 234 que son los números que nos hace falta re posicionar


Título: Re: invertir el número entero
Publicado por: lohayne en 20 Abril 2018, 04:25 am
funcionó usando el bucle,
pero necesito hacer usando el vector como pide el ejercicio, y no estoy consiguiendo


Título: Re: invertir el número entero
Publicado por: MAFUS en 20 Abril 2018, 07:23 am
Primero debes conseguir cuántos cifras componen el número. Si te dan 1000 este tiene 4 cifras, no 1000. Esto se con log10 y sumando 1: log10(1000)+1

Después creas un array de enteros de tantas cifras.

Después con el bucle que de NEBIRE y un índice vas dejando el número calculado al array.


Título: Re: invertir el número entero
Publicado por: lohayne en 21 Abril 2018, 02:14 am
Hola amigos, Rehice mi código y creé una función para contar dígitos. Mi programa funcionó hasta 8 dígitos, después de eso, el número fue invertido pero falta el último dígito pero no sé si es semántica error o debido a variable int.
Código:
#include <stdio.h>
#include <stdlib.h>

// função para contar digitos
int contdigitos(int n);

int main() {
    int n,i;
    int *v;
    int nd=contdigitos(n);
    //como vetor é dinâmico ,usei a função malloc
 v =(int*) malloc (nd*sizeof(int));
printf("digite um numero:");
scanf("%i",&n);
for (i=0;i<nd;i++) {
    v[i]=n%10;
    n=n/10;

    printf("%i",v[i]);
    if (n<=0)
    break;}
    return 0;}

 int contdigitos(int n) {
    if (n < 10) {
    return 1;
    }
    int contador = 0;
    while (n > 0) {
        n /= 10;
        contador++;
    }
    return contador;
}


Título: Re: invertir el número entero
Publicado por: Yuki en 21 Abril 2018, 02:33 am
No te entiendo la verdad, pero voy a dejar este código por acá...

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char* strrev2(char *buff){
  6. int i; // Variable indice.
  7. int ln = strlen(buff); // Obtenemos la longitud del buffer (para optimizar reserva de memoria).
  8. char * ret = (char*)calloc(1,ln); // Almacenamos un buffer rellenado a cero.
  9. for(i=0;i<ln;i++){
  10. ret[i] = buff[(ln-1)-i]; // Rellenamos el buffer de retorno con los carácteres del argumento.
  11. /* Notese que en la línea anterior, la variable asignada incrementa el indice
  12.   Y la variable que retorna los carácteres lo decrementa.
  13.   el (ln-1) es para saltar el carácter nulo.*/
  14. }
  15. return ret;
  16. }
  17.  
  18. int main() {
  19. char * buff = (char*)calloc(1,300); // Declaramos un variable puntero de cadena y le establecemos un buffer amplio.
  20. char * buff2; // Declaramos el puntero que contendrá la cadena invertida.
  21. printf("Escriba un número:"); // Escribimos en consola.
  22. scanf("%s",buff); // Obtenemos lo que ingresó el usuario.
  23. buff2 = strrev2(buff); // invertimos la cadena que ingresó el usuario.
  24. printf(buff2); // La imprimimos en pantalla.
  25. free((void*)buff); // Liberamos el primer buffer.
  26. free((void*)buff2); // Liberamos el segundo buffer.
  27. return 0;
  28. }


Título: Re: invertir el número entero
Publicado por: engel lex en 21 Abril 2018, 02:43 am
no entiendo la obsesión de hacerlo con for XD pero  puedes hacer

Código
  1. for (i=0;n>0;i++)


así el ciclo se rompe si n es 0 y puedes avanzar i al mismo tiempo

en contdigitos el if está de más, en general es redundante y puedes trabajar sin el


ya me di cuenta del error XD ejecutas contdigitos(n); antes de leer n... cuentas los digitos antes de leerlos XD


Título: Re: invertir el número entero
Publicado por: Kenji-chan en 21 Abril 2018, 04:17 am
este es el método que yo he utilizado

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int eleva10(int expo);
  5.  
  6. int main(int argc, char *argv[]) {
  7. int num, aux, digitos, i;
  8. int* inverso = NULL;
  9.  
  10. aux = 1;
  11. digitos = 1;
  12.  
  13. fprintf(stdout, "introduzca un numero: ");
  14. fscanf(stdin, "%d", &num);
  15.  
  16. while((aux*=10) < num) digitos++;
  17. inverso = (int*) malloc(digitos*sizeof(int));
  18.  
  19. aux = num;
  20. for(i=digitos; i>0; i--){
  21. inverso[i-1] = aux/eleva10(i);
  22. aux %= eleva10(i);
  23. }
  24.  
  25. for(i=0; i<digitos; i++){
  26. fprintf(stdout, "%d", inverso[i]);
  27. }
  28.  
  29. return 0;
  30. }
  31.  
  32. int eleva10(int expo){
  33. int ret = 1;
  34. if(expo == ret) return ret;
  35. for(int i=0; i<expo-1; i++) ret *= 10;
  36. return ret;
  37. }
  38.  

he creado la función int eleva10(int expo)porque la pow no me funciona bien XD


Título: Re: invertir el número entero
Publicado por: lohayne en 22 Abril 2018, 16:48 pm
Muchas gracias amigos, mi programa se está ejecutando perfectamente