write tag moz img images how for example description alternative c addition mod

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.