Z little-endian ints (i zakładając tekst ASCII i 8-bitowe bajty oraz wszystkie inne założenia, których wymaga kod) i ignorując wszystkie technicznie błędne elementy w nowoczesnym C w kodzie, twoje „Co rozumiem jak dotąd ”jest poprawne.
gets(&n)
zapisze wartości ASCII A, spacji i B w pierwszych 3 bajtach n
. Przechowuje również terminator zerowy w czwartym bajcie. Przechowywanie tych wartości ASCII do tych bajtów n
powoduje n
przyjmując wartość B*256*256 + space*256 + A
, gdzie B
, space
i A
reprezentują odpowiednie wartości ASCII.
256 mod 85 to 1, a więc przez właściwości arytmetyki modularnej,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
Nawiasem mówiąc, z 4-bajtowymi intami typu big-endian otrzymujemy
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
więc endianness nie ma znaczenia, o ile mamy 4-bajtowe liczby int. (Większe lub mniejsze wartości mogą stanowić problem; na przykład przy 8-bajtowych intach musielibyśmy się martwić o to, co jest w bajtach, n
które gets
nie zostały ustawione).
Spacja to ASCII 32, a wartość ASCII dla znaku cyfry to 48 + wartość cyfry. Definiując a
i b
jako wartości liczbowe wprowadzanych cyfr (zamiast wartości ASCII znaków cyfr), mamy
(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
gdzie ostatnie dwa odpowiedniki polegają na tym, że a
i b
przyjmują wartości od 0 do 9.