08--MOOC--C/C++ 根据年月日计算星期几——蔡勒公式篇

C/C++ 根据年月日计算星期几——蔡勒公式篇

蔡勒公式  蔡勒(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周年国庆)是星期五。
再比如计算2013年3月7日,过程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
 =13+[13/4]+[20/4]-2*20+[26*(3+1)/10]+7-1
 =-3 (除以7余4,注意对负数的取模运算!)

[cpp] view plain copy

  1. int ReturnWeekDay( unsigned int iYear, unsigned int iMonth, unsigned int iDay )
  2. {
  3. int iWeek = 0;
  4. unsigned int y = 0, c = 0, m = 0, d = 0;
  5. if ( iMonth == 1 || iMonth == 2 )
  6. {
  7. c = ( iYear - 1 ) / 100;
  8. y = ( iYear - 1 ) % 100;
  9. m = iMonth + 12;
  10. d = iDay;
  11. }
  12. else
  13. {
  14. c = iYear / 100;
  15. y = iYear % 100;
  16. m = iMonth;
  17. d = iDay;
  18. }
  19. iWeek = y + y / 4 + c / 4 - 2 * c + 26 * ( m + 1 ) / 10 + d - 1;    //蔡勒公式
  20. iWeek = iWeek >= 0 ? ( iWeek % 7 ) : ( iWeek % 7 + 7 );    //iWeek为负时取模
  21. if ( iWeek == 0 )    //星期日不作为一周的第一天
  22. {
  23. iWeek = 7;
  24. }
  25. return iWeek;
  26. }
时间: 2024-10-24 21:36:42

08--MOOC--C/C++ 根据年月日计算星期几——蔡勒公式篇的相关文章

今天星期几--蔡勒公式

今天星期几? 这样的问提在程序中常常是和日期一起来计算了. 在没接触蔡勒公式的时候,要我做我也很费劲的先去计算一更有多少天,然后在mod7: 但是今天遇到一个了这个公式.我就来看一下. 这就是公式. w就是我们要的周几了,c是世纪数-1(其实就是年份的前两位),y是年份的后两位,m是月份,d是天数 例如2014年5月8号  c=20 y =14 m=5 d=8: 看到这个东西是不是很喜欢啊,套上就出结果.别急,这个结果不是没天都对的,因为这里有两个特殊的月份需要处理,1月和2月,你会发现当你带入

蔡勒公式——根据年月日计算星期几

蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几. 计算公式 由于罗马教皇搞了一些骚操作,这里给出的公式仅适用于1582年10月15日以后的星期,详情可参考 格里高利历 符号意义 w:星期: w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 c:世纪(注:一般情况下,在公式中取值为已经过的世纪数,也就是年份除以一百的结果,而非正在进行的世纪,也就是现在常用的年份除以一百加一:不过如果年份是公元前的年份且非

POJ 3047 Bovine Birthday 给出年月日求星期 蔡勒公式

题目来源:POJ 3047 Bovine Birthday 题意:... 思路:蔡勒公式 适合于1582年(中国明朝万历十年)10月15日之后的情形 公式 w = y + y/4 + c/4 - 2*c + 26 * (m+1)/10 + d - 1; m如果是1 2 月份 y要倒退1年 m += 12 y是年份的后两位 y = year%100 c是世纪 c = year/100 #include <cstdio> #include <cstring> using namespa

蔡勒公式求今天是星期几?

之所以知道蔡勒公式,是因为今天在九度上做的一道题目[题目1043:Day of Week].以前也曾经做过求星期几这样的题目,当时的做法比较粗暴:已经知道某年某月某日是星期几,要求现在给的某天是星期几,直接求给的日期和已知日期的相差天数对7取余,再根据已知的星期做相应的调整即可.这样的做法不仅繁琐,而且一不留神就有可能算错.这次又碰到类似的题目,希望尝试新的方法.于是在查资料的过程中,知道了蔡勒公式.于是用蔡勒公式来解决了这道题目,虽然知道蔡勒公式,但是在使用过程中依旧错误不断.其实是因为对蔡勒

An problem about date 根据年月日计算 星期几

/W = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7(1.2月需要看作上一年的13.14月) #include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set>

python 日期换算星期 蔡勒公式

1 #!/usr/bin/env python 2 # encoding: utf-8 3 4 #coding=utf-8 5 6 date_star={ 7 '1':'星期一', 8 '2':'星期二', 9 '3':'星期三', 10 '4':'星期四', 11 '5':'星期五', 12 '6':'星期六', 13 '0':'星期日', 14 } 15 16 def caile(*args): 17 year,month,day = args 18 month = int(month) 1

c语言详解  蔡勒(Zeller)公式计算某一天是星期几  极其方便

—— 蔡勒(Zeller)公式 历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式.即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公式中的符号含义如下,w:星期:c:世纪-1:y:年(两位数):m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1.2月要看作上一年的13.14月来计算,比如2003年1月1日要看作2002年的13月1日来计算):d:日:[ ]代

C# 根据日期计算星期几

1 region 根据年月日计算星期几(Label2.Text=CaculateWeekDay(2004,12,9);) 2 /// <summary> 3 /// 根据年月日计算星期几(Label2.Text=CaculateWeekDay(2004,12,9);) 4 /// </summary> 5 /// <param name="y">年</param> 6 /// <param name="m">

蔡勒(Zeller)公式:根据日期推算是星期几

Zeller's Congruence: 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:日[ ]代表取整,即只