Autor
|
Tema: cifrar un entero de 4 cifras en lenguaje C. (Leído 8,139 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
Hola a todos y que tengan un muy buen día.- El programa debe leer un entero de cuatro dígitos y cifrar la información de la siguiente manera: reemplace cada dígito con residuo de la división entre 10 de la suma de dicho dígito mas 7. Posteriormente, intercambie el primer digito con el tercero, e intercambie el segundo dígito con el cuarto. Luego despliegue el entero cifrado.
Bueno con el enunciado tan bien explicado no me queda mucho para agregar, sólo decirles que estoy trabado con la última parte la de intercambio de dígitos, lo he intentado de varias manera pero no me funciono.- #include <stdio.h> int main(void){ int numero =5724, digito =0, div=1000, auxiliar =0, cifrado =0; while(numero>0){ numero = numero -(div*digito ); auxiliar = (digito +7)%10*div; cifrado += auxiliar; } printf("\n El n%cmero cifrado es...: %d\n", 163, cifrado ); return 0; }
Una cosita más, no tengan reparos en postear código que sea totalmente distinto al mío, el código es de mi propia idea y seguramente Uds. lo sabrán hacer de una manera más eficiente.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Lo suyo sería realizar el procedimiento en dos pasos: * calcular el residuo * reubicar los dígitos La primera opción se puede resolver con un bucle, la segunda hay que hacerla más a mano: int CifrarNumero( int numero ) { int digitos[4]; // Paso 1 : transformación int i; for ( i = 0; i < 4; i++ ) { digitos[ 3 - i ] = ( ( numero % 10 ) + 7 ) % 10; numero /= 10; } // Paso 2 : permutación digitos[ 0 ] ^= digitos[ 2 ] digitos[ 2 ] ^= digitos[ 0 ]; digitos[ 0 ] ^= digitos[ 2 ]; digitos[ 1 ] ^= digitos[ 3 ]; digitos[ 3 ] ^= digitos[ 1 ]; digitos[ 1 ] ^= digitos[ 3 ]; // Paso 3: Recomponemos el número. int resultado = 0; for ( i=0; i < 4; i++ ) { resultado *= 10; resultado += digitos[ i ]; } return resultado; }
Se puede optimizar, pero yo creo que funciona... no tengo compilador en el teléfono
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
estoy trabado con la última parte la de intercambio de dígitos, lo he intentado de varias manera pero no me funciono. Nada impide que proceses cada uno de los dígitos empezando con el menos significativo y terminando con el mas, lo usual mediante el uso del cociente y el residuo de la división entre diez. Una vez obtenido el nuevo dígito lo multiplicas por la potencia de diez necesaria para colocarlo en la posición correcta, de esta forma: #include <stdio.h> int main(void) { int pot[] = {100, 1000, 1, 10}; int num = 5724; int res = 0; int i; for (i = 0; i < 4; i++, num /= 10) res += (num + 7) % 10 * pot[i]; return 0; }
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola rir. Una pregunta y una reflexión: ¿sos extraterrestre? No dudo que ni a los autores del enunciado se les hubiera ocurrido hacer eso con 2 líneas.- Eferion gracias por responder, tú código compila sin errores pero siempre me da como resultado cero.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Eferion gracias por responder, tú código compila sin errores pero siempre me da como resultado cero.-
El código lo he probado y funciona perfectamente salvo por un detalle... falta un ';' en la línea 14... dudo que compile sin eso. (he usado un compilador C++)
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola eferion. Ok. Funciona a la perfección, sólo una cosita más, me podrías explicar esta línea de código. digitos[ 0 ] ^= digitos[ 2 ];
Se lo que hace el operador XOR (binario) pero no alcanzo a entender para que lo utilizaste en este caso.- Desde ya gracias por tu tiempo y por favor tutéame que tengo edad de abuelo(62) pero no lo aparento.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
la idea de esas líneas es intercambiar el valor de las dos variables: te lo pongo con valores binarios: int a = 20; // 10100 int b = 29; // 11101 a ^= b; // a = 01001 b = 11101 b ^= a; // a = 01001 b = 10100 a ^= b; // a = 11101 b = 10100 // Despues del codigo: // a = 29 -> 11101 // b = 20 -> 10100
Esto es equivalente a: int a = 20; int b = 29; int temp = a; a = b; b = temp; // Despues del codigo: // a = 29 // b = 20
Esto también se puede hacer con sumas y restas: int a = 20; int b = 29; a += b; // a = 49 b = 29 b = a - b; // a = 49 b = 49-29=20 a = a - b; // a = 49-20=29 b = 20 // Despues del codigo: // a = 29 // b = 20
Hay más formas de hacerlo, pero creo que la idea queda clara.
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola. En este caso el principal uso es para evitar tener que declarar otra variable temporal, ¿estoy en lo cierto ?.- De ser así y si lo preferís no me respondas, lo damos por sentado.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
En este caso el principal uso es para evitar tener que declarar otra variable temporal, ¿estoy en lo cierto ?.-
El evitar declarar una variable es un efecto colateral... simplemente es una muestra de que no hay una forma fija y concreta de hacer las cosas en programación.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Encontrar algoritmo: De 9 cifras a 8 cifras
Criptografía
|
dualbit_2
|
2
|
4,873
|
19 Noviembre 2010, 04:42 am
por dualbit_2
|
|
|
Guardar un entero de de 10 cifras
Bases de Datos
|
dimitrix
|
4
|
3,569
|
16 Julio 2012, 22:46 pm
por dimitrix
|
|
|
Descomponer un numero entero en lenguaje C.
« 1 2 »
Programación C/C++
|
NOB2014
|
10
|
13,997
|
1 Abril 2014, 20:59 pm
por eferion
|
|
|
Lenguaje C temas (en orden) que debo aprender para dominar este Lenguaje?
Programación C/C++
|
r_fercho
|
3
|
7,158
|
8 Mayo 2014, 04:56 am
por r_fercho
|
|
|
Cómo convertir binarios en un entero del lenguaje C de programación
Programación C/C++
|
El_Andaluz
|
4
|
5,856
|
3 Junio 2016, 14:55 pm
por AlbertoBSD
|
|