蔡勒公式(巧妙计算星期几)

萌到你眼炸
740次浏览
2021年02月12日 07:31
最佳经验
本文由作者推荐

-

2021年2月12日发(作者:有关月亮的歌曲)


蔡勒公式



蔡勒(


Ze ller


)公式,是一个计算星期的公式,随便给一个日期,就能用这个公


式推算出是星期几。



公式





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






若要计算的日 期是在


1582



10



4


日或之前


,


公式则为





w=y+[y/4]+[c/4]-2c+[13(m+1)/5]+d+3





其中意义:




w


:星期;


w



7


取模得:


0-

< br>星期日,


1-


星期一,


2-


星期二,


3-


星期三,

4-


星期四,


5-


星期五,


6-


星期六





c


:世纪(前两位数)





y


:年(后两位数)





m


:月(


m


大于等于


3


,小于等于


14


,即在蔡勒公式中,某年的

1



2



要看作上一年的


13



14

< p>
月来计算,比如


2011



1



1


日要看作

2010


年的


13



1


日来计算)





d


:日





[ ]


代表取整,即只要整数部分。





下面以中华人民共和国成立


100< /p>


周年纪念日那天(


2049


< p>
10



1


日)

< p>
来计算是星期几,过程如下:





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


年组织了一批天文学家,根据哥白尼日心

< br>说计算出来的数据,对


儒略历


作了修改。将


1582



10



5


日到


14


日之间



10


天宣布撤销,继

10



4


日之后为


10



15


日。





后来人们将这一新 的历法称为“格里高利历”,也就是今天世界上所通


用的历法,简称

格里历



公历


< br>


计算代码





1582



10



4


日之后的计算代码如下:





c


代码:





#include




int main()




{




int year,month,day;




while(scanf(




int i,j,k;




int c=year/100;




int y=year-c*100;




int week=int(c/ 4)-2*c+int(y+y/4)+int(13*(month+1)/5)+day-1;




while(week<0) { week+=7; }




week%=7;




switch(week)




{




case 1: printf(




case 2: printf(




case 3: printf(




case 4: printf(




case 5: printf(




case 6: printf(




case 0: printf(




}




}




return 0;




}




C++


代码:





#include




using namespace std;




int main(){




int year,month,day;




while(cin >> year >> month >> day){




if ( month < 3 ) {




year -= 1;




month += 12;




}




char b[7][10] =


{


urday




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;




Pascal


代码



-


-


-


-


-


-


-


-