Autor
|
Tema: invertir el número entero (Leído 12,562 veces)
|
lohayne
Desconectado
Mensajes: 8
|
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)); for (i=0;i<n;i++) { cifra=n%10; n=n/10; v=cifra; return 0;}
· Los códigos deben ir en etiquetas GeSHi (corregido) >aquí las reglas del foro -Engel Lex
|
|
« Última modificación: 20 Abril 2018, 02:29 am por engel lex »
|
En línea
|
|
|
|
engel lex
|
tienes un problema logico en tu operación for (i=0;i<n;i++) { cifra=n%10; n=n/10; v=cifra; }
primera linea: para i empezando en 0, mientras que i sea menor que nen 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
|
|
|
En línea
|
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.
|
|
|
En línea
|
|
|
|
Kenji-chan
Desconectado
Mensajes: 104
|
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
|
|
|
En línea
|
|
|
|
lohayne
Desconectado
Mensajes: 8
|
funcionó usando el bucle, pero necesito hacer usando el vector como pide el ejercicio, y no estoy consiguiendo
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
lohayne
Desconectado
Mensajes: 8
|
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; }
|
|
« Última modificación: 21 Abril 2018, 02:16 am por lohayne »
|
En línea
|
|
|
|
Yuki
Desconectado
Mensajes: 80
El error es una muestra de la incompetencia.
|
No te entiendo la verdad, pero voy a dejar este código por acá... #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; }
|
|
|
En línea
|
|
|
|
engel lex
|
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
|
|
« Última modificación: 21 Abril 2018, 02:52 am por engel lex »
|
En línea
|
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
Desconectado
Mensajes: 104
|
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: "); 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++){ } 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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Comprobar si un numero es entero
Programación Visual Basic
|
Neobius
|
6
|
34,188
|
21 Abril 2006, 08:04 am
por Neobius
|
|
|
Invertir numero de coma flotante
Programación C/C++
|
jaguirred
|
5
|
3,523
|
26 Febrero 2017, 22:01 pm
por engel lex
|
|
|
invertir un número con recursividad en java
Java
|
PleySu
|
9
|
20,995
|
13 Marzo 2017, 00:38 am
por ivancea96
|
|
|
Ejercicio de invertir un numero en vb.net (algo incomprendido)
.NET (C#, VB.NET, ASP)
|
DSREY
|
8
|
10,901
|
25 Junio 2017, 20:34 pm
por okik
|
|
|
Invertir un número dado
Programación C/C++
|
BortizF
|
3
|
3,077
|
18 Octubre 2017, 16:20 pm
por BortizF
|
|