invertir el número entero

Iniciado por lohayne, 20 Abril 2018, 02:25 AM

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

lohayne

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?


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

int main() {
   int n,cifra,i;
   int *v;
    v =(int*) malloc (n*sizeof(int));
   printf("escriba un numero:");
   scanf("%i",&n);
   for (i=0;i<n;i++) {
   cifra=n%10;
   n=n/10;
   v=cifra;
   printf("%i",v );}
   return 0;}



· Los códigos deben ir en etiquetas GeSHi (corregido)
>aquí las reglas del foro
-Engel Lex

engel lex

tienes un problema logico en tu operación

for (i=0;i<n;i++) {
   cifra=n%10;
   n=n/10;
   v=cifra;
   printf("%i",v );
}


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

en este caso si el numero por ejemplo es 118

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

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Serapis

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í:


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.


Kenji-chan

la resolución de este problema es sencilla
primero tienes que averiguar la cantidad de dígitos que tiene el numero ingresado


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

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


num = num%valor_proposicional
/* num = 1234%1000

esto nos devolverá 234 que son los números que nos hace falta re posicionar

lohayne

funcionó usando el bucle,
pero necesito hacer usando el vector como pide el ejercicio, y no estoy consiguiendo

MAFUS

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.

lohayne

#6
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.

#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;
}

Yuki

No te entiendo la verdad, pero voy a dejar este código por acá...

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* strrev2(char *buff){
int i; // Variable indice.
int ln = strlen(buff); // Obtenemos la longitud del buffer (para optimizar reserva de memoria).
char * ret = (char*)calloc(1,ln); // Almacenamos un buffer rellenado a cero.
for(i=0;i<ln;i++){
ret[i] = buff[(ln-1)-i]; // Rellenamos el buffer de retorno con los carácteres del argumento.
/* Notese que en la línea anterior, la variable asignada incrementa el indice
   Y la variable que retorna los carácteres lo decrementa.
   el (ln-1) es para saltar el carácter nulo.*/
}
return ret;
}

int main() {
char * buff = (char*)calloc(1,300); // Declaramos un variable puntero de cadena y le establecemos un buffer amplio.
char * buff2; // Declaramos el puntero que contendrá la cadena invertida.
printf("Escriba un número:"); // Escribimos en consola.
scanf("%s",buff); // Obtenemos lo que ingresó el usuario.
buff2 = strrev2(buff); // invertimos la cadena que ingresó el usuario.
printf(buff2); // La imprimimos en pantalla.
free((void*)buff); // Liberamos el primer buffer.
free((void*)buff2); // Liberamos el segundo buffer.
return 0;
}

engel lex

#8
no entiendo la obsesión de hacerlo con for XD pero  puedes hacer

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Kenji-chan

este es el método que yo he utilizado


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

int eleva10(int expo);

int main(int argc, char *argv[]) {
int num, aux, digitos, i;
int* inverso = NULL;

aux = 1;
digitos = 1;

fprintf(stdout, "introduzca un numero: ");
fscanf(stdin, "%d", &num);

while((aux*=10) < num) digitos++;
inverso = (int*) malloc(digitos*sizeof(int));

aux = num;
for(i=digitos; i>0; i--){
inverso[i-1] = aux/eleva10(i);
aux %= eleva10(i);
}

for(i=0; i<digitos; i++){
fprintf(stdout, "%d", inverso[i]);
}

return 0;
}

int eleva10(int expo){
int ret = 1;
if(expo == ret) return ret;
for(int i=0; i<expo-1; i++) ret *= 10;
return ret;
}


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