任何人都可以为这个插口算法代码Pitiny.c做头或者故事
这个C程序只有143个字符!
但它“解压缩”为Pi的前10,000位数字. // Created by cheeseMan on 30/11/13. long a[35014],b,c=35014,d,e,f=1e4,g,h; int main(int argc,const char * argv[]) { for(;(b=c-=14); h=printf("%04ld",e+d/f)) for(e=d%=f;(g=--b*2);d/=g) d=d*b+f*(h?a[b]:f/5),a[b]=d%--g; } 当我遇到这个pitiny.c时,我正在研究无损压缩算法,但仍然没有运气. 奇怪的是,它成功编译没有错误或错误,但就像我说我不能成为代码的头或者故事,甚至它的语法.我想知道最近发生了什么?这究竟是做什么的? 解决方法
更新
这个程序是故意混淆了spigot算法for the Digits of Pi的实现,来自Pi-Unleashed,我们可以在page 37 of the book找到原始版本,如下所示:
论文Unbounded Spigot Algorithms for the Digits of Pi在解释算法方面做得很好.基本上它是这种扩展的实现: 原版的 设计这种方式的原因除了让代码无法理解和令人印象深刻的人逃避了我,但我们可以分解正在发生的事情,首先在这里: long a[35014],h; 变量是静态的,因为它们是全局的,所以未显式初始化的所有变量都将初始化为0.接下来我们有一个外部for循环: for(;(b=c-=14); h=printf("%04ld",e+d/f) ^ ^ ^ 1 2 3 >是一个空的初始化,它也是一个null statement. 现在我们有一个内部for循环: for(e=d%=f;(g=--b*2);d/=g) ^ ^ ^ 1 2 3 >初始化e和d到d模数f. 最后是for for循环的主体: d=d*b+f*(h?a[b]:f/5),a[b]=d%--g; ^ ^ 1 2 使用conditional operator in 1和comma operator in 2.所以我们至少可以把它分成: d = d*b+f*(h?a[b]:f/5) ; // (1) a[b] = d%--g; // (2) (1)可以进一步细分为: long tmp = h ? a[b] : f/5 ; // conditional operator d = (d * b) + f * tmp; 条件运算符仅在第一次迭代期间很重要,因为h初始化为0但之后永远不会再为0,因为它总是在外部for循环中被赋予非零值,所以除了第一次h之外的其他值将被赋值为[ b]. (2)将再次由于优先级预先递减g,然后评估d模数结果并将其分配给a [b]. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |