छोटे-एंडियन इन्ट्स (और ASCII टेक्स्ट, और 8-बिट बाइट्स, और अन्य सभी मान्यताओं के लिए कोड की आवश्यकता होती है) के साथ, और कोड में सभी तकनीकी-गलत-इन-आधुनिक-सी सामानों को अनदेखा करते हुए, आपका "आप क्या समझते हैं" अब तक "सही है।
gets(&n)
पहले 3 बाइट्स में ए, अंतरिक्ष और बी के एएससीआईआई मूल्यों को संग्रहीत करेगा n
। यह 4 वें बाइट में एक शून्य टर्मिनेटर भी संग्रहीत करेगा। उन लोगों के बाइट्स में उन ASCII मूल्यों भंडारण n
में परिणाम n
मूल्य लेने B*256*256 + space*256 + A
, जहां B
, space
, और A
इसी ASCII मूल्यों प्रतिनिधित्व करते हैं।
256 mod 85 1 है, इसलिए मॉड्यूलर अंकगणितीय के गुणों से,
(B*256*256 + space*256 + A) % 85 = (B + space + A) % 85
संयोग से, 4-बाइट बिग-एंडियन इनट्स के साथ, हमें मिलता है
(A*256*256*256 + space*256*256 + B*256) % 85 = (B + space + A) % 85
इसलिए जब तक हमारे पास 4-बाइट्स होते हैं, तब तक धीरज की बात नहीं होती है। (बड़ा या छोटा ints एक समस्या हो सकती है; उदाहरण के लिए, 8-बाइट ints के साथ, हमें इस बारे में चिंता करनी होगी n
कि उस बाइट में gets
क्या सेट नहीं है।)
अंतरिक्ष ASCII 32 है, और एक अंक चरित्र के लिए ASCII मूल्य 48 + अंक का मान है। परिभाषित a
और b
अंकों के संख्यात्मक मान के रूप में (अंकों के ASCII मूल्यों के बजाय), हमारे पास है
(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
जहां अंतिम दो समतुल्य इस तथ्य पर भरोसा करते हैं कि a
और b
0 से 9 तक मान लेते हैं।