tag - Además de C usando módulo
seo image alt tag example (1)
Encontré un código C intrigante que imprime
A + B
, pero tengo problemas para entenderlo.
Formato de entrada:
A B
donde
A
,
B
son números enteros entre
0
y
10
separados por un solo espacio.
Código:
main( n )
{
gets( &n );
printf("%d", n % 85 - 43);
}
Esto fue pensado para codificación corta, por favor, no te preocupes por las advertencias.
Lo que entiendo hasta ahora:
gets( &n )
almacena los valores ASCII de A, espacio y B en los tres bytes inferiores de
n
.
Por ejemplo,
A = 3
y
B = 8
darían
n = 0x00382033
.
Las condiciones dadas previenen que
n
desborde.
Pero no entiendo cómo
n % 85 - 43
produce
A + B
¿Cómo se te ocurren estos números?
Con los ints little-endian (y asumiendo el texto ASCII y los bytes de 8 bits, y todas las otras suposiciones que requiere el código), e ignorando todas las cosas técnicamente incorrectas en la modernidad en el código, su "Lo que entiendo hasta ahora "es correcto.
gets(&n)
almacenará los valores ASCII de A, espacio y B en los primeros 3 bytes de
n
.
También almacenará un terminador nulo en el 4to byte.
Almacenar esos valores ASCII en esos bytes de
n
da como resultado que
n
tome el valor
B*256*256 + space*256 + A
, donde
B
,
space
y
A
representan los valores ASCII correspondientes.
256 mod 85 es 1, entonces por las propiedades de la aritmética modular,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Por cierto, con 4 bytes de big-endian ints, obtenemos
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
por lo tanto, el endianness no importa, siempre y cuando tengamos ints de 4 bytes.
(Ints más grandes o más pequeños podrían ser un problema; por ejemplo, con ints de 8 bytes, tendríamos que preocuparnos por lo que hay en los bytes de
n
que no se establece).
El espacio es ASCII 32, y el valor ASCII para un carácter de dígito es 48 + el valor del dígito.
Definiendo
a
y
b
como los valores numéricos de los dígitos ingresados (en lugar de los valores ASCII de los caracteres de dígitos), tenemos
(B + space + A) % 85 = (b + 48 + 32 + a + 48) % 85
= (a + b + 128) % 85
= (a + b + 43) % 85
(B + space + A) % 85 - 43 = (a + b + 43) % 85 - 43
= (a + b) % 85
= a + b
donde las dos últimas equivalencias se basan en el hecho de que
b
toman valores de 0 a 9.