Con ints little-endian (y asumiendo texto ASCII y bytes de 8 bits, y todas las demás suposiciones que requiere el código), e ignorando todas las cosas técnicamente incorrectas en C moderno 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 cuarto byte. El almacenamiento de esos valores ASCII en esos bytes de n
resultados en n
tomando el valor B*256*256 + space*256 + A
, donde B
, space
y A
representar los valores ASCII correspondientes.
256 mod 85 es 1, por lo que según las propiedades de la aritmética modular,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Por cierto, con ints big-endian de 4 bytes, obtenemos
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
así que endianness no importa, siempre que tengamos entradas de 4 bytes. (Los 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 n
que gets
no se configuraron).
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 a
y b
toman valores de 0 a 9.