- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
万年历算法的实现
/*
* cal.c
*
* Created on: Apr 10, 2011
* Author: Administrator
*
* 现行的格里历是从儒略历演化而来的。儒略历每4年一个润年,润年366天,平年365天。
* 如果从公元1年算的话,那么凡是能够被4整除的都是润年。从天文角度看,儒略历这种
* 历法是有误差的,到16世纪误差已经达到了10天。1582年,罗马教皇对儒略历进行了
* 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再
* 算为润年,校定之后的儒略历即为现行的格里历。
*
* 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了11天,原因是1700
* 年在儒略历中是润年,而在格里历中是平年。1752年英国议会决定将本年的9-3到9-13
* 这11天抹掉,以同步格里历。当时美国不是英国的殖民地,所以在美国的日历中也是没有
* 1752-9-3到1752-9-13这11天的。 我们知道UNIX系统源于美国,Linux系统源于UNIX,
* 这就是为什么当我们在Linux系统中敲cal 9 1752这条命令时,会看到一个只有19天
* 的9月。
*
* 以上内容参考自维基百科
*
* 本程序模似Linux中cal命令的部分功能。允许输入的年分为1...9999。
* 编译器:gcc V4.5.0
*
* 分析:
* 1752年是特殊年,1752-9月是特殊年中的特殊月。
*
* 1752-9-2之前,采用的是儒略历,凡能被4整除都为润年;1752-9-14之后,采用的是
* 格里历,不能被400整除的世纪年不再作为润年。
*
* 格里历闰年计算方法
* 世纪年 ***4000的倍数 **3200/1900的倍数 400的倍数 100的倍数 4的倍数
* 结果 不闰 不闰 闰 不闰 闰
* 注:
* 3200/1900的倍数是天文科学家研究出来
* 增加4000的倍数不闰更准确,但目前只是世纪年还不足4000,因此尚未用途
*
* 格里历在400年的周期中有146,097天,恰好是20,871 星期。所以,例如,格里历七年、
* 407年、807年、1207年、1607年、2007年的日期与星期是完全相同的。也就是说,格里
* 历每400年一个周期。
*
* 公元1-1-1,按儒略历是周六,按格里历是周一;因1752-9-2之前采用的都是儒略历,所以
* 公元1-1-1应该是周六。
* 1752-9-14是周四。
*
* 公元1-1-1到1752-9-2,日期是连续的,儒略历;公元1752-9-14至今,日期是连续的,格里历。
*
* 对于给定的一个 年(Y)-月(M)-日(D) ,则从公元1-1-1到 给定的日期的天数为:
* 1752-9-2前:365*(Y-1)+(Y-1)/4+e,其中e表示从Y-1-1到Y-M-D的天数,
* 且这天是该周的第((Y-1)+(Y-1)/4+5+e)%7天。
*
* 1752-9-14后:365*(Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e,
* 且这天是该周的第((Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e)%7天。
*
* 需要注意的是,从1-1-1到1752-9-14之后的某个日期的天数并非实际的天数,它只是根据格里历的
* 的规则推算出来的,目的也只是为了得到日期与星期的对应。
*
* 算法思想:
* 对于年历,若能知道本年的1月1日是周几,也就知道了本年的年历分布。
* 对于月历,若能知道本月的1日是周几,也就知道了本月的月历分布。
* 所以关键是正确的推算出给定的一个日期是星期几。以下为推算方法:
* 1752-9-2之前:((Y-1)+(Y-1)/4+5+e)%7
* 1752-9-14之后:((Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+e)%7
* 把1800-2199年当成一个周期,对于其后的日期,只需在1800-2199之间找到
* 对应的日期,就可以知道是星期几,这样就不用再考虑4000年之后4000的倍数
* 不是润年这种情况。 (Y-1800)%400+1800
*
原创力文档


文档评论(0)