忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12345下一页
最近访问板块 发新帖
查看: 11171 | 回复: 44

[学习共享] 来写几段天书式的dc程序 [复制链接]

论坛徽章:
0
发表于 2012-12-01 20:23 |显示全部楼层
本帖最后由 星条旗 于 2012-12-02 09:35 编辑

喜欢用dc写程序的有两种人:

1.那些热衷搞机械指令集的老派的程序员。

2.喜欢让别人和自己都读不懂自己所写程序的偏执狂。

那段出名到被维基百科的dc programming页码中列出的,神秘难懂,用来求质数的dc程序,额估计就是后者写的。

http://bbs.chinaunix.net/thread-316197-2-1.html

但是由于dc 语言独特的语法模型结构,花一点时间深入一下还是有好处的。

对dc程序命令和逆波兰一窍不通的童鞋先去看入门介绍:

http://bbs.chinaunix.net/thread-2303294-1-1.html

http://en.wikipedia.org/wiki/Dc_(computer_program)

http://www.mkssoftware.com/docs/man1/dc.1.asp
  1. ok,首先,先来做做热身:

  2. dc为逆波兰式运算,k命令将主栈栈顶的值弹出,并设置为计算精度 ,p命令打印栈顶值到终端

  3. dc -e '2k 1 2 3 * / p'



  4. r命令 交换主栈栈顶头两个值的位置。

  5. dc -e '2k 2 3 * 1 r / p'



  6. ? 表示用户可键入标准输入,sA和 lA为对寄存器A的操作,用来释放和储存临时变量,寄存器也是一个栈。

  7. 此程序用来计算欧拉常数E,输入值为迭代次数。

  8. dc -e '100k ? sAlA1r/1+lA^ p'



  9. 下面展示了一个基本的dc程序循环流程,类似于c中的for或while。

  10. z命令取到主栈长度并将该值压入主栈,d命令为复制栈顶值并将该值压入主栈。

  11. <J为条件判别,当主栈顶的头两个值a,b符合b<a时弹出 a ,b 并跳转到寄存器J,执行J的顶的命令。

  12. x为执行主栈顶部[ ... ]中的命令,并将[ ... ]弹出。

  13. 此程序计算了主栈中所有数值的和。

  14. dc -e '1 2 3 0 4 0.5 2 k z [sR + lR 1- d1<J]sJlJx sK p'



  15. 注意 dc所接受的输入也必须是逆波兰形式。

  16. f命令表示打印整个主栈。

  17. dc -e '?  f'

  18. 1 0 1 -

  19. -1

  20. 1

  21. dc -e '?  f'

  22. 1 2 3 + 1

  23. 1

  24. 5

  25. 1



  26. dc -e '1[d 1+ d3>R ]sRlRx f '

  27. 下面分析一下这个程序,列个表来表述最清楚。。

  28. 命令           1         [d 1+ d3>R ]sR       lR                   x            d 1+ d3       >R        。。。

  29. 主栈            1             1               1  [d 1+ d3>R ]       1           1 2 2 3      1 2       。。。

  30. 寄存器R       空          [d1+ d3>R ]      [d..不变]           [d..不变]       [d..不变]   [d..不变]         



  31. 继续上面的表格,程序继续运行寄存器R的栈顶的 [d1+ d3>R]内容     

  32. 命令           d 1+ d3          >R         循环结束      f

  33. 主栈          1 2 3  3  3      1 2 3                   1 2 3

  34. 寄存器R      [d..不变]       [d..不变]                [d..不变]

  35. 所以最后到f命令打印主栈内容的结果到终端,最后是 3 2 1



  36. 我的运行环境

  37. simone@Infinite-Inspiron:~/shell$ uname -a
  38. Linux Infinite-Inspiron 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

  39. simone@Infinite-Inspiron:~/shell$ bash --version
  40. GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
  41. Copyright (C) 2011 Free Software Foundation, Inc.

  42. simone@Infinite-Inspiron:~/shell$ uname -a
  43. Linux Infinite-Inspiron 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

  44. 如果大家还感兴趣的话,额会继续来写几段稍微复杂点的:)
复制代码

论坛徽章:
0
发表于 2012-12-01 20:29 |显示全部楼层
回复 1# 星条旗


    yo ~~~~~~~~~
    wel - come ~

论坛徽章:
0
发表于 2012-12-01 20:33 |显示全部楼层
回复 2# hbmhalley

拜读过您的帖子,很有启发!

论坛徽章:
0
发表于 2012-12-01 20:37 |显示全部楼层
好,先拿projecteuler上的一道简单题目开刀:
The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317.

Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000.
(计算上面和式的后十位)

http://projecteuler.net/problem=48

简单的用dc加起来就行,没有什么算法:
  1. dc -e ' 1[ s! l!d^  l!1+ l!1000>w]swlwxs# z [s@ + l@ 1- d1<<]s<l<xs# f'
复制代码

论坛徽章:
0
发表于 2012-12-01 20:45 |显示全部楼层
本帖最后由 hbmhalley 于 2012-12-01 20:46 编辑

回复 4# 星条旗


    你真的 ... 算了 1000^1000 ...
    其实有个 | 运算符,专门算模意义下的幂
  1. dc -e '?10 10^sw[d1-d0<a rdlw|+lw%]dsaxp'
复制代码

论坛徽章:
0
发表于 2012-12-01 20:57 |显示全部楼层
回复 5# hbmhalley


汗,学习了!
以后请多多指教!


   

论坛徽章:
0
发表于 2012-12-01 20:59 |显示全部楼层
用级数展开公式,计算正弦函数值:
  1. dc -e '100k ? s~ 1[ s! l~ 2 l! * 1 + ^ 2 l! * 1 + [q]s.[d1=.d1-l_x*]ds_x / 0 1 - l! ^ * l!1+ l!20>w]swlwxs= l~ z [s@ + l@ 1- d1<<]s<l<xs= p'
复制代码
输入 1 回车 即得到 sin(1)的值
由于 dc所能接受的输入必须是逆波兰式输入,所以要计算 sin(-1)的话需键入:
0 1 -

论坛徽章:
0
发表于 2012-12-01 22:07 |显示全部楼层
回复 7# 星条旗


    0 1 -    ====     _1

论坛徽章:
7
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2012-12-01 22:49 |显示全部楼层
牛!学习了!

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2012-12-01 22:57 |显示全部楼层
不实用,感觉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP