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
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
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
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
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++)
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
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.
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
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.