但它“解压缩”为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找到原始版本,如下所示:
a[52514],c=52514,h;main(){for(;b=c-=14;h=printf(“%04d”,
e+d/f))for(e=d%=f;g=–b*2;d/=g)d=db+f(h?a[b]:f/5),a[b]=d%–g;}
论文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.
>从c中减去14并将值分配回c并将相同的值分配给b.此循环将执行2500次,因为35014/14为2501,并且在第2501次迭代时结果将为0,因此为假并且循环将停止.
> h被赋予printf的结果,即打印的字符数.正在打印的是e d / f的结果,并且由于格式说明符中的04,因此总是至少4位数和零填充.
现在我们有一个内部for循环:
for(e=d%=f;(g=--b*2);d/=g) ^ ^ ^ 1 2 3
>初始化e和d到d模数f.
>由于operator precedence,b的预先减少和倍数乘以2并将结果分配给g
> d除以g并分配结果.
最后是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 operatord = (d * b) + f * tmp;
条件运算符仅在第一次迭代期间很重要,因为h初始化为0但之后永远不会再为0,因为它总是在外部for循环中被赋予非零值,所以除了第一次h之外的其他值将被赋值为[ b].
(2)将再次由于优先级预先递减g,然后评估d模数结果并将其分配给a [b].
总结以上是内存溢出为你收集整理的任何人都可以为这个插口算法代码Pitiny.c做头或者故事全部内容,希望文章能够帮你解决任何人都可以为这个插口算法代码Pitiny.c做头或者故事所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)