80 votes

Ajout c à l’aide de modulus

Je suis tombé sur une intrigante code C qui imprime A + B, mais j'ai du mal à le comprendre.

Format D'Entrée:

A B

A, B sont des entiers compris entre 0 et 10 séparés par un seul espace.

Code:

main( n )
{
    gets( &n );
    printf("%d", n % 85 - 43);
}

Cela était destiné à court codage, s'il vous plaît ne pas l'esprit les mises en garde.

Ce que je comprends à ce jour:

gets( &n ) stocke les valeurs ASCII de Un, espace de, et la partie B dans la partie inférieure de trois octets d' n. Par exemple, A = 3 et B = 8 donnerait n = 0x00382033. Compte tenu des conditions de prévenir n de déborder. Mais je ne comprends pas comment n % 85 - 43 rendements en A + B.

Comment pouvez-vous arriver à ces chiffres?

87voto

user2357112 Points 37737

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 + AB, 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X