泽勒一致性

2010年10月8日

如果你决定不自己计算公式,数学博士会给出一个易于阅读的公式推导。公式如下:

f=k+\floor(13m-1)/5\floor+d+\floor\frac{d}{4}\floor+\floor/frac{c}{4{\floor-2 c\mod 7

在这里k个是一个月的第几天,是月份数,取3月=1,2月=12,是年份的最后两位数,并且c(c)是一年中的前两位数字;计算年份数时c(c),上一年用于一月和二月。然后(f)是星期几,星期日=0,星期六=6。

根据公式,很容易编写一个函数来计算星期几:

(定义(zeller年-月-日)
(让*(m(如果(<第3个月)(+第10个月))
(年(如果(<第3个月)(-1年)年)
(d(模yr 100))
(list-ref'(星期日星期一星期二星期三星期四星期五星期六)
(模(+天(商(-(*13 m)1)5)d
(商d4)(商c4)(*-2c))

我们使用朱利安格雷戈里亚人函数和断言来自的宏标准前奏曲; 测试于1753年1月1日开始,持续了1000年:

(do((i 2361331(+1)))((=i 2726573))
(let值((年月日)(格雷戈里安i))
(断言(list-ref)(周一周二周三周五周六周日)
(模(朱利安年月日)7)
(泽勒年月日))

您可以在以下位置运行程序http://programmingpraxis.codepad.org/YNmQyDN1.

页:1 2

5对“Zeller一致性”的回应

  1. […]今天的编程实践练习,我们的目标是实现Christian Zeller为[…]创建的函数

  2. 雷姆科·尼梅耶

    My Haskell解决方案(请参阅http://bonsaicode.wordpress.com/2010/10/08/programming-praxis-zeller%E2%80%99s-同余/对于带有注释的版本):

    data Weekday=Su|Mo|Tu|We|Th|Fr|Sa派生(枚举、等式、显示)zeller::国际->国际->国际->工作日zeller年-月-日=toEnum$mod(天+div(13*m-1)5+d+div d4+div c4-2*c)7其中y=如果月份<3,则年份-其他年份m=如果月份<3,则月份+10,否则月份-2(c,d)=divMod y 100
  3. 杀人
    #f=k+地板(13m-1)/5)+d+地板(d/4)+地板(c/4)-2c mod 7def zeller(年、月、日)months=%w[三月四月五月六月八月九月十月十一月十二月一月二月]工作日=%w[周日-周一-周二-周三-周四-周五-周六]k=天m=months.index(month.downcase)+1y=(m<=10)?年份:第一年d=y%100c=年/100f=(k+((13*m)-1)/5).楼层+d+(d/4).楼板+(c/4).楼层-(2*c))%7工作日结束普斯·泽勒(2010年10月8日)
  4. Khanh Nguyen先生
    开放式系统打开系统。收藏。通用打开Microsoft。F竖琴。收藏打开Microsoft。F竖琴。数学(*跟随http://en.wikipedia.org/wiki/Zeller%27s_conjuence(英文)*)让zeller_conguence(年:int)(月:int)let weekdays=[“周六”;“周日”;“周一”;“周二”;“周三”;“周四”;“周五”]设m=浮动(如果(月份<3),则月份+12其他月份)设y=如果(月<3),则年份-1其他年份设K=浮动(y%100)设J=浮动(y/100)设h=浮标(日)+地板((m+1.0)*26.0/10.0)+K+地板(K/4.0)+地面(J/4.0)-2.0*J平日。[整数(h)%7]泽勒一致性2010 10 10泽勒一致性2010 2 10
  5. […]计算一周中哪一天的算法,一个在标准前奏曲中,另一个在Zeller一致性练习中。在今天的练习中,我们再给出三种算法来计算[…]的日期

留下评论