问题标题: 菜乐公式

0
0

0
已采纳
黄品翔
黄品翔
初级光能
初级光能
蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。
中文名 蔡勒公式 外文名  Zeller formula 作    用 一个计算星期的公式 注    意 1,2月要当成上一年的13,14月计算性质公式

(或者是:  )
若要计算的日期是在1582年10月4日或之前,公式则为

以1582年10月4日为例:
1582年10月4日后:w = (d + 1+ 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
1582年10月4日前:w = (d+1+2*m+3*(m+1)/5+y+y/4+5) % 7;
或者1752年9月3日为例
1752年9月3日后:w = (d + 2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
1752年9月3日前:w = (d+2*m+3*(m+1)/5+y+y/4+5) % 7;
注:罗马教皇决定在1582年10月4日后使用格利戈里历法;而英国则是在1752年9月3日后才接受使用格利戈里历法。
注意:
当年的1,2月要当成上一年的13,14月进行计算
符号意义编辑
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(注:一般情况下,在公式中取值为已经过的世纪数,也就是年份除以一百的结果,而非正在进行的世纪,也就是现在常用的年份除以一百加一;不过如果年份是公元前的年份且非整百数的话,c应该等于所在世纪的编号,如公元前253年,是公元前3世纪,c就等于-3)
y:年(一般情况下是后两位数,如果是公元前的年份且非整百数,y应该等于cMOD100+100)
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余5,注意对负数的取模运算!实际上应该是星期二而不是星期五)
w=(-12%7+7)%7=2;
适用范围编辑
不过,蔡勒公式只适合于1582年(中国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。
后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。
计算代码编辑
1582.10.4之后的计算代码如下:
php代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function week($date = '', $show = false) {
    if (empty($date)) {
        $date = date('Y-m-d', time());
    }
    list($y, $m, $d) = explode('-', $date);

    if ($m == 1 || $m == 2) {
        $m += 12;
        $y -= 1;
        $d += 1;
    }

    $week = ($d+2*$m+3*($m+1)/5+$y+$y/4-$y/100+$y/400)%7;

    if ($show) {
        switch($week) {
            case 0 :
                return '星期日';
                break;
            case 1:
                return '星期一';
                break;
            case 2:
                return '星期二';
                break;
            case 3:
                return '星期三';
                break;
            case 4:
                return '星期四';
                break;
            case 5:
                return '星期五';
                break;
            case 6:
                return '星期六';
                break;
        }
    } else {
        return $week;
    }
}
c代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
int main()
{
 int year, month, day;
 while (scanf("%d %d %d", &year, &month, &day) != EOF)
 {
  if (month == 1 || month == 2)//判断month是否为1或2 
   year--, month += 12;
  int c = year / 100;
  int y = year - c * 100;
  int week = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
  while (week < 0)
   week += 7;
  week %= 7;
  switch (week)
  {
  case 1:printf("Monday\n"); break;
  case 2:printf("Tuesday\n"); break;
  case 3:printf("Wednesday\n"); break;
  case 4:printf("Thursday\n"); break;
  case 5:printf("Friday\n"); break;
  case 6:printf("Saturday\n"); break;
  case 0:printf("Sunday\n"); break;
  }
 }
 return 0;
}
C++代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
usingnamespacestd;
int main(){
int year,month,day;
while(cin>>year>>month>>day){
if(month<3){
year-=1;
month+=12;
}
charb[7][10]={"sunday","monday","tuesday","wednesday","thursday","friday","saturday"};
int c=int(year/100),y=year-100*c;
int w=int(c/4)-2*c+y+int(y/4)+(26*(month+1)/10)+day-1;
w=(w%7+7)%7;
cout<<b[w]<<endl;}return 0;}
Python代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#coding=utf-8

# 计算星期
def getWeekDate(*args):
    year,month,day = args
    year = int(year)
    year = year - int(year / 100) * 100    
    century = int(year/100)
    month = int(month)
    if month == 1 or month == 2:
        month = month + 12
        if year == 0:
            year = 99
            century = century - 1
        else:
            year = year - 1
    day =int(day)
    week = year + int(year/4) + int(century/4) - 2 * century + int(26 * (month + 1)/10) + day - 1
    if week < 0:
        weekDay = (week % 7 + 7) % 7
        else:
        weekDay = week % 7
    return weekDay


date = raw_input('输入年份月份天数,以空格分割')
#year = date.split(' ')[0];month=date.split(' ')[1];day=date.split(' ')[2]
year,month,day = date.split(' ')
print getWeekDate(year,month,day)

  
Pascal代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
program clgs;
var
a,b,c,d,y,x:longint;
begin
readln(a,b,d);
if b<3 then begin b:=b+12;a:=a-1; end;
y:=a mod 100;
c:=a div 100;
x:=y+trunc(y/4)+trunc(c/4)-2*c+trunc(13*(b+1)/5+d-1);
while x<=7 do
x:=x+7;
writeln((x-1) mod 7+1);
end.

 

0
毛润宇
毛润宇
新手天翼
新手天翼
蔡勒公式(Zeller's congruence),是一种计算任何一日属一星期中哪一日的算法,由德国数学家克里斯提安·蔡勒推算出来。
目
录
1公式
2例子
3儒略历时期公式
1公式
or

公式都是基于公历的置闰规则来考虑。

公式中的符号含义如下:

w:星期(计算所得的数值对应的星期:0-星期日;1-星期一;2-星期二;3-星期三;4-星期四;5-星期五;6-星期六)

c:年份前两位数

y:年份后两位数

m:月(m的取值范围为3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)

d:日

[ ]:称作高斯符号,代表向下取整,即,取不大于原数的最大整数。

mod:同余(这里代表括号里的答案除以7后的余数)

因为



可能为负数,所以当出现负数的情况下不能直接mod 7。编写成代码的时候如果两个操作数中只有一个负数,求模的结果取决于机器,也就是说某些情况下w在一些机器上为负数,但是在某一些机器上w不一定为负数(例如:21%-5的结果取决于机器,可能得到1或-4),对于产生负数这种情况可将原来公式分为两步:



;w = ( w % 7 + 7 ) % 7;

若为一月二月,则看作为去年的13月和14月输入,同时在年份上减一。以上各式中的“%”符号表示取余运算。

2例子
对2006年4月4日而言,代入公式算出:







得知为星期二。 

3儒略历时期公式
若要计算的日期是在1582年10月4日或之前的儒略历实施年代,公式则为:

or

这是因罗马教宗额我略十三世颁布新历法(公历),把1582年10月4日的后一天改为1582年10月15日。此一公式也要注意前述附注中出现负数的情况。

求采纳!

0
0
0
0
毕小曼
毕小曼
初级光能
初级光能

字打错了,是“蔡勒公式”不是“菜乐公式”

0
0
焦瑾瑜
焦瑾瑜
初级守护
初级守护

哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊哪一题啊

0
0
张俊洋
张俊洋
资深守护
资深守护

W是所求日期的星期数. 
如果求得的数大于7,可以直接对7取余,不过周日就输出为0了。 
如果求得的数小于0,可以加上7的倍数,直到结果大于零小于7为止 
c是公元年份的前两位数字, 
y是已知公元年份的后两位数字; 
m是月数, 
d是日数. 
方括[ ]表示只截取该数的整数部分。

所求的月份如果是1月或2月,则应视为前一年的13月或14月. 
所以公式中m 的取值范围不是1-12,而是3-14.

模板代码(虽然没什么用)

int Change(int year,int month,int day)//根据日期判断出星期几
{
    if(month==1||month==2)
    {
        month+=12;
        year--;
    }
    int c=year/100;
    int y=year%100;
    int m=month;
    int d=day;
    int W=c/4-2*c+y+y/4+26*(m+1)/10+d-1;
    if(W<0)
        return (W+(-W/7+1)*7)%7;
    return W%7;

}

0
0
0
我要回答