A+B(可能)最短代码原理

本文深入解析了POJ A+B问题的最短代码实现,通过数学推导和模运算法则,展示了如何利用特定数值进行快速计算。同时,文章还探讨了如何根据这一原理构造其他magic number。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

POJ上的A+B题目虽简单,但被各种人玩出花来,链接:http://poj.org/problem?id=1000

输入a b,0≤a≤9, 0≤b≤9,输出a+b
输入样例:8 1
输出样例:9

可能长度最短代码

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

参考POJ Dicuss

证明

上述代码中nint类型,在get(&n)中存储了3字节的字符数据。
令a的ascii码ca,b的ascii码cb,空格的ascii码cs,则
x86平台,CPU是小端模式,所以 n = c a + ( c s &lt; &lt; 8 ) + ( c b &lt; &lt; 16 ) n = ca + (cs &lt;&lt; 8) + (cb &lt;&lt; 16) n=ca+(cs<<8)+(cb<<16)

经过查表得到, c a = a + 48 ca = a + 48 ca=a+48, c b = b + 48 cb = b + 48 cb=b+48, c s = 32 cs = 32 cs=32
则有 n = a + 48 + ( 32 &lt; &lt; 8 ) + ( ( b + 48 ) &lt; &lt; 16 ) n = a + 48 + (32 &lt;&lt; 8) + ((b + 48) &lt;&lt; 16) n=a+48+(32<<8)+((b+48)<<16)

为了实现a+b,需要在保持a的因数是1的情况下,让b的因数变为1,可以使用求模的运算法则。
求模有以下两种运算法则
a + b ≡ a &VeryThinSpace; m o d &VeryThinSpace; r + b &VeryThinSpace; m o d &VeryThinSpace; r ( m o d r ) a × b ≡ a × ( b &VeryThinSpace; m o d &VeryThinSpace; r ) ≡ ( a &VeryThinSpace; m o d &VeryThinSpace; r ) × ( b &VeryThinSpace; m o d &VeryThinSpace; r ) ( m o d r ) \begin{aligned} &amp;a + b ≡ a\bmod r + b \bmod r&amp;\pmod{r}\\ &amp;a \times b ≡ a\times (b\bmod r) ≡ (a\bmod r) \times (b\bmod r) &amp;\pmod{r} \end{aligned} a+bamodr+bmodra×ba×(bmodr)(amodr)×(bmodr)(modr)(modr)

x = a + 48 + ( 32 &lt; &lt; 8 ) x = a + 48 + (32 &lt;&lt; 8) x=a+48+(32<<8) y = ( b + 48 ) &lt; &lt; 16 y = (b + 48) &lt;&lt; 16 y=(b+48)<<16,则
x = 8240 + a ≡ 80 + a ( m o d 85 ) y = ( b + 48 ) × 65536 ≡ ( b + 48 ) &VeryThinSpace; m o d &VeryThinSpace; 85 × ( 65536 &VeryThinSpace; m o d &VeryThinSpace; 85 ) = b + 48 ( m o d 85 ) n = x + y ≡ ( 80 + a ) + ( b + 48 ) ≡ a + b + 43 ( m o d 85 ) \begin{aligned} x &amp;= 8240 + a ≡ 80 + a &amp;\pmod{85}\\ y &amp;= (b+48) \times 65536 \\&amp;≡ (b+48) \bmod 85 \times (65536 \bmod 85) \\&amp;= b+48 &amp;\pmod{85}\\\\ n &amp;= x + y \\&amp;≡ (80 + a) + (b+48) \\&amp;≡ a + b + 43 \pmod{85} \end{aligned} xyn=8240+a80+a=(b+48)×65536(b+48)mod85×(65536mod85)=b+48=x+y(80+a)+(b+48)a+b+43(mod85)(mod85)(mod85)

由于 0 ≤ a ≤ 9 , 0 ≤ b ≤ 9 0≤a≤9, 0≤b≤9 0a9,0b9,则
a + b + 43 ≤ 18 + 43 = 61 &lt; 85 ⇒ ( a + b + 43 ) &VeryThinSpace; m o d &VeryThinSpace; 85 = a + b + 43 ⇒ n &VeryThinSpace; m o d &VeryThinSpace; 85 = ( a + b + 43 ) &VeryThinSpace; m o d &VeryThinSpace; 85 = a + b + 43 \begin{aligned} &amp;a + b + 43 ≤ 18 + 43 = 61 &lt; 85\\ &amp;\Rightarrow(a + b + 43) \bmod 85 = a + b + 43 \\ &amp;\Rightarrow n \bmod 85 = (a + b + 43) \bmod 85 = a + b + 43 \end{aligned} a+b+4318+43=61<85(a+b+43)mod85=a+b+43nmod85=(a+b+43)mod85=a+b+43
综上, a + b = n &VeryThinSpace; m o d &VeryThinSpace; 85 − 43 a + b = n \bmod 85 - 43 a+b=nmod8543

拓展

根据这个规律,可以构造其他magic number,如 n%51-26
为了让b的因数变为1,找出除65536的余数是1的除数r,这样有
( b + 48 ) × 65536 ≡ b + 48 ( m o d r ) (b+48) \times 65536 ≡ b+48 \pmod{r} (b+48)×65536b+48(modr)
所以,
n = a + 48 + ( 32 × 256 ) + ( ( b + 48 ) × 65536 ) ≡ a + 48 + ( 32 × 256 ) + b + 48 ≡ a + b + 8288 &VeryThinSpace; m o d &VeryThinSpace; r ( m o d r ) \begin{aligned} n &amp;= a + 48 + (32 \times 256) + ((b + 48) \times 65536) \\ &amp;≡ a + 48 + (32 \times 256) + b+48 \\ &amp;≡ a + b + 8288\bmod r \pmod{r} \end{aligned} n=a+48+(32×256)+((b+48)×65536)a+48+(32×256)+b+48a+b+8288modr(modr)
为了寻找r,对 65536 − 1 65536-1 655361 进行质因数分解,得到 65535 = 257 × 17 × 5 × 3 65535 = 257\times17\times5\times3 65535=257×17×5×3
容易发现, 85 = 17 × 5 85 = 17 \times 5 85=17×5 是其中 65535 的一个因数。
此外,r还有一个条件: a + b + 8288 &VeryThinSpace; m o d &VeryThinSpace; r &lt; r a + b + 8288\bmod r &lt; r a+b+8288modr<r
经过搜索,r = 51 也满足上述约束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值