Vraag C-toevoeging met modulus


Ik kwam een ​​intrigerende C-code tegen die drukt A + B, maar ik heb moeite het te begrijpen.

Invoer formaat:

A B

waar A, B zijn gehele getallen tussen 0 en 10 gescheiden door een enkele spatie.

Code:

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

Dit was bedoeld voor een korte codering, let alstublieft niet op de waarschuwingen.

Wat ik tot nu toe begrijp:

gets( &n ) slaat de ASCII-waarden van A, spatie en B op in de onderste drie bytes van n. Bijvoorbeeld, A = 3 en B = 8 zou opbrengen n = 0x00382033. Gegeven omstandigheden voorkomen n van overlopen. Maar ik begrijp niet hoe n % 85 - 43 opbrengsten A + B.

Hoe kom je met deze cijfers?


73
2017-07-19 05:06


oorsprong


antwoorden:


Met little-endian-ints (en uitgaande van ASCII-tekst en 8-bits bytes en alle andere aannames die de code vereist) en het negeren van alle technisch-verkeerde-in-moderne C-spullen in de code, je "Wat ik begrijp tot nu toe "is correct.

gets(&n) slaat de ASCII-waarden van A, spatie en B op in de eerste 3 bytes van n. Het slaat ook een nul-terminator op in de 4e byte. Het opslaan van die ASCII-waarden in die bytes van n resulteert in n de waarde aannemen B*256*256 + space*256 + A, waar B, space, en A vertegenwoordigen de corresponderende ASCII-waarden.

256 mod 85 is 1, dus door de eigenschappen van modulaire rekenkunde,

(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85

Overigens krijgen we met 4-byte big-endian-ints

(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85

dus endianness maakt niet uit, als we maar 4-bytes hebben. (Grotere of kleinere ints kunnen een probleem zijn, bijvoorbeeld met 8-bytes ints, we zouden ons zorgen moeten maken over wat er in de bytes van n dat gets is niet ingesteld.)

Spatie is ASCII 32 en de ASCII-waarde voor een cijfer is 48 + de waarde van het cijfer. Het definiëren a en b als de numerieke waarden van de ingevoerde cijfers (in plaats van de ASCII-waarden van de cijfers), hebben we

(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

waar de laatste twee equivalenten vertrouwen op het feit dat a en b neem waarden van 0 tot 9.


84
2017-07-19 05:42