Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 9 Septiembre 2014, 21:40 pm



Título: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: NOB2014 en 9 Septiembre 2014, 21:40 pm
Hola a todos y que tengan un muy buen día.-

Citar
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.-

Código
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. int numero=5724, digito=0, div=1000, auxiliar=0, cifrado=0;
  5. while(numero>0){
  6. digito = numero/div;
  7. numero = numero-(div*digito);
  8. auxiliar = (digito+7)%10*div;
  9. cifrado += auxiliar;
  10. div /= 10;
  11. }
  12.  
  13.  
  14. printf("\n El n%cmero cifrado es...: %d\n", 163, cifrado);
  15.  
  16. return 0;
  17. }

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


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: eferion en 9 Septiembre 2014, 23:17 pm
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:

Código
  1. int CifrarNumero( int numero )
  2. {
  3.  int digitos[4];
  4.  
  5.  // Paso 1 : transformación
  6.  int i;
  7.  for ( i = 0; i < 4; i++ )
  8.  {
  9.    digitos[ 3 - i ] = ( ( numero % 10 ) + 7 ) % 10;
  10.    numero /= 10;
  11.  }
  12.  
  13.  // Paso 2 : permutación
  14.  digitos[ 0 ] ^= digitos[ 2 ]
  15.  digitos[ 2 ] ^= digitos[ 0 ];
  16.  digitos[ 0 ] ^= digitos[ 2 ];
  17.  
  18.  digitos[ 1 ] ^= digitos[ 3 ];
  19.  digitos[ 3 ] ^= digitos[ 1 ];
  20.  digitos[ 1 ] ^= digitos[ 3 ];
  21.  
  22.  // Paso 3: Recomponemos el número.
  23.  int resultado = 0;
  24.  for ( i=0; i < 4; i++ )
  25.  {
  26.    resultado *= 10;
  27.    resultado += digitos[ i ];
  28.  }
  29.  
  30.  return resultado;
  31. }

Se puede optimizar, pero yo creo que funciona... no tengo compilador en el teléfono


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: rir3760 en 10 Septiembre 2014, 01:17 am
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:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int pot[] = {100, 1000, 1, 10};
  6.   int num = 5724;
  7.   int res = 0;
  8.   int i;
  9.  
  10.   for (i = 0; i < 4; i++, num /= 10)
  11.      res += (num + 7) % 10 * pot[i];
  12.  
  13.   printf("%d\n", res);
  14.  
  15.   return 0;
  16. }

Un saludo


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: NOB2014 en 10 Septiembre 2014, 03:47 am
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


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: eferion en 10 Septiembre 2014, 08:16 am
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++)


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: NOB2014 en 10 Septiembre 2014, 13:07 pm
Hola eferion.
Ok. Funciona a la perfección, sólo una cosita más, me podrías explicar esta línea de código.

Código
  1. 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.- ;D ;D ;D

Saludos.
Daniel


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: eferion en 10 Septiembre 2014, 13:20 pm
la idea de esas líneas es intercambiar el valor de las dos variables:

te lo pongo con valores binarios:

Código
  1. int a = 20; // 10100
  2. int b = 29; // 11101
  3.  
  4. a ^= b; // a = 01001 b = 11101
  5. b ^= a; // a = 01001 b = 10100
  6. a ^= b; // a = 11101 b = 10100
  7.  
  8. // Despues del codigo:
  9. // a = 29 -> 11101
  10. // b = 20 -> 10100

Esto es equivalente a:

Código
  1. int a = 20;
  2. int b = 29;
  3.  
  4. int temp = a;
  5. a = b;
  6. b = temp;
  7.  
  8. // Despues del codigo:
  9. // a = 29
  10. // b = 20

Esto también se puede hacer con sumas y restas:

Código
  1. int a = 20;
  2. int b = 29;
  3.  
  4. a += b; // a = 49 b = 29
  5. b = a - b; // a = 49 b = 49-29=20
  6. a = a - b; // a = 49-20=29 b = 20
  7.  
  8. // Despues del codigo:
  9. // a = 29
  10. // b = 20

Hay más formas de hacerlo, pero creo que la idea queda clara.


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: NOB2014 en 10 Septiembre 2014, 19:12 pm
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


Título: Re: cifrar un entero de 4 cifras en lenguaje C.
Publicado por: eferion en 10 Septiembre 2014, 21:07 pm
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.