Avec little-endian ints (et en supposant que texte ASCII, et les octets de 8 bits, et toutes les autres hypothèses, le code l'exige), et en ignorant toutes les techniques de mal-en-moderne-C des trucs dans le code, votre "Ce que j'ai compris jusqu'à présent" est correct.
gets(&n)
va stocker les valeurs ASCII de l'espace et de la B dans les 3 premiers octets de l' n
. Il va également de stocker un terminateur null dans le 4e octet. Le stockage de ces valeurs ASCII dans ces octets d' n
résultats en n
prenant la valeur B*256*256 + space*256 + A
où B
, space
, et A
représentent les valeurs ASCII correspondant.
256 mod 85 est 1, donc, par les propriétés de l'arithmétique modulaire,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Par ailleurs, avec 4 octets big-endian ints, nous obtenons
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
donc, endianness n'a pas d'importance, aussi longtemps que nous avons 4 octets entiers. (Plus grand ou plus petit ints pourrait être un problème; par exemple, avec 8 octets entiers, nous devrions avoir à vous soucier de ce qui est dans les octets d' n
que gets
n'est pas défini.)
L'espace est l'ASCII 32, et la valeur ASCII d'un caractère numérique est de 48 + la valeur du chiffre. La définition d' a
et b
que les valeurs numériques des chiffres entrés (plutôt que les valeurs ASCII des caractères numériques), nous avons
(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
où les deux derniers équivalences compter sur le fait qu' a
et b
prendre des valeurs de 0 à 9.