最近有网友在微博上向我反映,《算法的乐趣》随书的例子代码中关于农历历法的演示程序出了BUG,并截了图给我,我开始以为是算法中的某些部分不兼容64位系统,后来发现在32位系统上一样有问题,什么问题呢?先看看截图:
看到了吧,“三十月大”,走查代码,发现是处理农历闰月的时候重拍月序关系,导致越界访问了。对了一下历法,2015年不是闰年,怎么会走到闰月处理的流程中去了呢?
跟了一下代码,终于找到原因了,原来是“民间历法”和“历理历法”的差异捣的鬼。先复习一下《 算法系列之二十:计算中国农历(二) 》中关于“民间历法”和“历理历法”的小知识:
新中国成立以后没有颁布新的“官方农历历法”,将历法和政治分离体现了时代的进步,但是由于没有 “官方历法”,也引起了一些问题。比如我国现在采用的农历历法是《时宪历》,它源于清朝顺治年间(公元1645)颁布的《顺治历》,它有两个不足之处:一个是日月合朔和节气的时间以北京当地时间为准,也就是东经116度25分的当地时间,其节气和新月的观察只适用于中原地区。其它经度的地方,因为时间的关系,对导致日月合朔和节气时间的差异导致置闰和月顺序各不相同。另一个不足之处就是日月合朔时间和节气时间判断不精确,如果日月合朔时间和节气时间在同一天,不管具体的时间是否有先后,一律将此节气算做新月中的节气,这样一来,如果这个节气是中气,就会影响到闰月的设置。历理历法针对这两点进行了改进&