计算任何一天是星期几的几种算法
生活随笔
收集整理的這篇文章主要介紹了
计算任何一天是星期几的几种算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
計算任何一天是星期幾的幾種算法
一:常用公式
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份數,D是這一天在這一年中的累積天數,也就是這一天在這一年中是第幾天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符號含義如下,w:星期;c:世紀;y:年(兩位數); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算);d:日;[ ]代表取整,即只要整數部分。
相比于通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的復雜度。
三:對蔡勒(Zeller)公式的改進
相比于另外一個通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的復雜度。不過,筆者給出的通用計算公式似乎更加簡潔(包括運算過程)。現將公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符號含義如下,r ( )代表取余,即只要余數部分;m’是m的修正數,現給出1至12月的修正數1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在筆者給出的公式中,y為潤年時1’=5;2’=1)。其他符號與蔡勒(Zeller)公式中的含義相同。
四:基姆拉爾森計算公式
這個公式名稱是我給命名的,哈哈希望大家不要見怪。
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算 //y:年,m:月,d:日。在參數都只傳入相應的整數// ********************************************/ string str_week(int y,int m,int d){ int a=7; // 用來保存計算得到的星期幾的整數string str_date="";if((m==1)||(m==2))//如果是一月或二月進行換算{m+=12;y--;}a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; //得到的星期幾的整數switch (a){ case 0:str_date="星期一";break;case 1:str_date="星期二";break;case 2:str_date="星期三";break;case 3:str_date="星期四";break;case 4:str_date="星期五";break;case 5:str_date="星期六";break;case 6:str_date="星期日";break;}return str_date; }int main() {int y, m, d;cout << "輸入日期:如 2012-03-30" << endl;scanf("%d-%d-%d", &y, &m,&d);cout << str_week(y, m, d) << endl; }
原文地址:http://blog.csdn.net/whz_zb/article/details/7425260
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份數,D是這一天在這一年中的累積天數,也就是這一天在這一年中是第幾天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符號含義如下,w:星期;c:世紀;y:年(兩位數); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算);d:日;[ ]代表取整,即只要整數部分。
相比于通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的復雜度。
三:對蔡勒(Zeller)公式的改進
相比于另外一個通用通用計算公式而言,蔡勒(Zeller)公式大大降低了計算的復雜度。不過,筆者給出的通用計算公式似乎更加簡潔(包括運算過程)。現將公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符號含義如下,r ( )代表取余,即只要余數部分;m’是m的修正數,現給出1至12月的修正數1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在筆者給出的公式中,y為潤年時1’=5;2’=1)。其他符號與蔡勒(Zeller)公式中的含義相同。
四:基姆拉爾森計算公式
這個公式名稱是我給命名的,哈哈希望大家不要見怪。
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算 //y:年,m:月,d:日。在參數都只傳入相應的整數// ********************************************/ string str_week(int y,int m,int d){ int a=7; // 用來保存計算得到的星期幾的整數string str_date="";if((m==1)||(m==2))//如果是一月或二月進行換算{m+=12;y--;}a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; //得到的星期幾的整數switch (a){ case 0:str_date="星期一";break;case 1:str_date="星期二";break;case 2:str_date="星期三";break;case 3:str_date="星期四";break;case 4:str_date="星期五";break;case 5:str_date="星期六";break;case 6:str_date="星期日";break;}return str_date; }int main() {int y, m, d;cout << "輸入日期:如 2012-03-30" << endl;scanf("%d-%d-%d", &y, &m,&d);cout << str_week(y, m, d) << endl; }
原文地址:http://blog.csdn.net/whz_zb/article/details/7425260
總結
以上是生活随笔為你收集整理的计算任何一天是星期几的几种算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt:解决使用png图片时,报错libp
- 下一篇: Android自定义属性 format详