原创 从菜农的“星期算法”到知道“蔡勒公式”后的感慨

2008-9-6 17:38 5131 5 5 分类: MCU/ 嵌入式

http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=3063061


俺从月星期表算法到抛弃月星期表的公式算法,开始是从联想手机


将月星期表算法推导出来的。


结果和网友电子白菜的雷同~~~


所以就想抛弃月星期表算法用公式算法抛弃月星期表想这样就不会


与人“雷同”了,结果还是“雷同”~~~


蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。

蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪-1(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年国庆)是星期五。

再比如计算2006年4月4日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意对负数的取模运算!)

不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。
后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历公历

俺主要是依据“立交桥下推导过程”:


推导过程:
1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
   由于公元1月1日设为星期六,故3月1日为星期三。         ——注意这个“三”
   为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2。每400年整一闰,或每4年且不为百年的一闰。
   百年%4=0闰或(年%4=0并且年<>0)闰。
3。每 4年(3个平年+1个闰年)共208周+5天                  ——注意这个“5天”
   每百年共100*(208周+5天)-1天=5217周+5天              ——注意这个“5天”(整
百年暂设为平年)
   每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
   即400年一轮回!(原来万年历400年前是一家)
4。万年3月1日星期算法(记住那个三)
   公式:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
         某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
   或    某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   
   闰4百年3月1日星期算法(百年%4=0)
   公式:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
   例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
       2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
       2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
       2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六

   平4百年3月1日星期算法(百年%4<>0)
   公式:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平
年)
       1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平
年)
       1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平
年)
       1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
       1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
       1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
       1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
       1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
       2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:
2100年是平年)
       2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
       2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
       2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
       2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:
2104年是闰年)
       9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
   注:按400年一轮回!(400年前是一家)的说法
       1600年,2000年是一样的
       1700年,2100年是一样的
       1800年,2200年是一样的
       1900年,2300年是一样的
       所以,万年历实际上是骗人的,应该叫“四百年历”才是。万只是多的意思罢了。
5. 万年某日星期算法  
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通同星期偏差表
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2

最终得到了菜农算法(还不敢成为“公式”~~~):


星期=(百年%4*5+年+年/4+(13*月+8)/5+日)%7


当时是琢磨如何抛弃月星期表,即换成现在的(13*月+8)/5


新算法:星期=(百年%4*5+年+年/4+(13*月+8)/5+日)%7
旧算法:星期=(百年%4*5天+年+年/4+月星期表+日+2天)%7

不同之处为月星期表+2天 和 (13*月+8)/5

例如:
3月时,星期表+2天=0+2=2
      (13*月+8)/5=(13*3+8)/5=47/5=9--->2

12月时,星期表+2天=2+2=4
      (13*月+8)/5=(13*12+8)/5=164/5=32--->4

注意下面有差异:

1月时, 闰年星期表+2天=3+2=5
        平年星期表+2天=4+2=6
      (13*月+8)/5=(13*5+8)/5=73/5=14--->05月表+2)

2月时, 闰年星期表+2天=6+2=8--->1
        平年星期表+2天=0+2=2
      (13*月+8)/5=(13*6+8)/5=86/5=17--->3(6月表+2)

新算法的1月2月的年被认为的改变为"去年"
y--;//1月2月的年为"去年"

具体推导过程早忘了,我要找找,估计原稿早丢了,因为我以前
都是随手发帖,但绝对是“原创”.
不信可以搜索“13*月+8”,很难发现正解。

总之这个算法抛弃了“闰年/闰月”,以3月为基月,这样排列
的“一年”将是“固定的”,这是“最后一天”不同,即2月的
28日或29日。


世界“雷同”的事情太多了~~~


实际用3月为基月的想法的人太多了~~~因为只有2月在捣乱!!!


所以我们要将“二月分子入监”移入“月队列尾部”。


所以“一月”肯定是个倒霉鬼~~~


但这2个月虽然排在“月队列尾部”,但“顺序”自然归“去年”


所以就有了13月14月的想法即蔡勒公式。


哈哈~~~在这里我是今天才知道---蔡勒公式。很是惭愧~~~

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条