万年历算法的实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档