第20届国际C语言代码大赛《科学计算器》代码分析

liangbch 2012-04-28 01:31:54
见: http://blog.csdn.net/liangbch/article/details/7514743

总的说来,这个递归的小程序是超级复杂,要想完全分析清楚,绝非易事。这里只能找出关键点,来各个击破。

1. 在程序中,经常看见连续的~,在该程序中,偶数个~等于与0,可删除之,奇数个波浪线等于-1,不可删除。
2. 对于表达的分析部分,对于 函数名称 与数学函数的映射,是通过一个hash函数来完成的。其等价的哈希函数如下
int math_func_hash(char ch)
{
char c=(ch * (int) 11 / 26 + 222 / 31 ) & 15;
int b=(ch % 21 + 7) % 9 * (3 * 367 >> c & 1);
return b;
}

在这个函数中,26个小写英文字母(也包括‘-’和‘/’)字母与key的映射关系如下
a->2,
b->3,
c->4,
p->5,
y->5,
q->6,
z->6,
f->7,
i->7,
g->8,
j->8,
'-’-> 1
'/' -> 3
其余字母,统统映射为0,当key为0时,不做任意处理。这个hash表是经过精心设计的。以下几个函数和运算符号中,每个函数中仅仅有一个字母的key不为0,且这几个字母(key值不为0的字母)对应的key互不相同,这样,函数名和key就建立起一个一一映射。根据key的值决定那个数学函数。
key=1,调用'-',
key=2,调用'tan'函数,
key=3,调用'/‘
key=4,调用'cos‘
key=5,调用'exp‘
key=6,调用'sqrt‘
key=7,调用'sin‘
key=8,调用'log‘.


...全文
338 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
SLSnake 2012-05-22
  • 打赏
  • 举报
回复
牛人,我看了会就头晕了。。
liangbch 2012-05-22
  • 打赏
  • 举报
回复
好久没有人顶了,结贴。
woshi_ziyu 2012-04-28
  • 打赏
  • 举报
回复
不错 支持
modyaj 2012-04-28
  • 打赏
  • 举报
回复
楼主就是牛 两贴我连看 望尘莫及。。
gold_water 2012-04-28
  • 打赏
  • 举报
回复
Defonds 2012-04-28
  • 打赏
  • 举报
回复
各个击破
evencoming 2012-04-28
  • 打赏
  • 举报
回复
[code=C/C++]UP[/CODE]

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧