cifrar un entero de 4 cifras en lenguaje C.

Iniciado por NOB2014, 9 Septiembre 2014, 21:40 PM

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

NOB2014

Hola a todos y que tengan un muy buen día.-

CitarEl 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){
digito = numero/div;
numero = numero-(div*digito);
auxiliar = (digito+7)%10*div;
cifrado += auxiliar;
div /= 10;
}


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

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

rir3760

Cita de: NOB2014 en  9 Septiembre 2014, 21:40 PMestoy 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];
   
   printf("%d\n", res);
   
   return 0;
}


Un saludo
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

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

Cita de: NOB2014 en 10 Septiembre 2014, 03:47 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++)

NOB2014

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.- ;D ;D ;D

Saludos.
Daniel
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

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.

NOB2014

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

Cita de: NOB2014 en 10 Septiembre 2014, 19:12 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.