求个C++万年历

来源:百度知道 编辑:UC知道 时间:2024/06/29 21:35:42
哪个写过这个的,教下小弟,源代码就不用发了,留下个Q,教我写就得了~~

阳历有一定的规律,大家都知道。
阴历也有一定的规律,阴历每月也有大小之分,月大为30天,月小为29天。而阳历月大为31天,月小为30天,只有2月不同。这样,一年下来,通常阳历和阴历就会相差10天左右,如果这样下去不做处理,不到几十年,当农历到了过年之时却是阳历的6月,正是大热天。于是就产生了润月,所谓润月,就是为了补了阳历和阴历每年相差的天数,每3年左右就会在这一年增加一个月,也就是说这一年有13个月,多出的这一月称之为润月。润月跟在某月之后称之为润某月,如跟在一月之后则称之为润一月。当然,润月也有大小,大为30天,小为29天。

虽然阴、阳历都有规律,但阴历和阳历之间的转换却没有直接的算法。既然没有直接的算法,那么我们就得想办法。
下面正式开始说方法:

用一个无符号整型数组将每一年的农历信息记录下来,你想转换的年数范围多大,就把这个数组定义为多大。

整型数为4个字节,32位
我们从这32位中取12位出来,记录这一年12个月每个月的大小,二进制0表月小,1表月大 如2007年为0010 0101 1101
取7位出来记录这年农历的第一天和这年阳历第一天也就是元旦相差的天数,如2007年相差48天,二进制为 0110000
取4位记录这一年润第几月,没有润月则为0 如,2006年润7月 则为 0111 2007年不润月为 0000
取1位记录润月大小 0为小,1为天,若不润月也记录为0
这32位里面用24位,多的8位可全为0,也可全为1,或另有别用也行

举个例子,把多的8位放在前面且全为1,接下来是记录月大小的12位,再是7位记录元旦和正月初一相差天数,再一位记录润月大小,最后是4位记录润月,如是,2007年的信息可写成 1111 1111 0010 0101 1101 0110 0000 0000 十六进制为 FF25D600

由阳历计算农历:
先输入要转换的阳历日期,如:20071012
得到这一天后,算出这一天离这一年元旦的天数N 20071012为例 得到 N=285,

若这个天数N大于正月初一离元旦的天数M