快速計算某個日期是星期幾的經驗公式 - w3c學習教程

文章推薦指數: 80 %
投票人數:10人

快速計算某個日期是星期幾的經驗公式,巧算星期幾基姆。

... 的嘗試成功了,你就能擁有一個易於程式設計的數學公式,並能用它自動計算哪天是星期幾了。

快速計算某個日期是星期幾的經驗公式 2021-05-2615:24:49字數4265閱讀7273 巧算星期幾 基姆。

拉爾森 基姆擁有計算機學科的博士學位。

他對資料庫,演算法和資料結構有著濃厚的興趣。

他的聯絡地址是           (原文 為丹麥文--譯者注)31,dk-5270,odensen,denmark,或發e-mail至:[email protected]

簡介布魯斯施耐爾 “四,六,九,十一,三十天就齊……”兒歌是這麼唱的;或許你也曾經掰著手指頭翻來覆去地數,讓趕上單數的指頭 代表只有30天的短月吧?這樣的口訣對我們是很管用的(我就是念叨著這首傻乎乎的兒歌長大的),可是電腦就沒有這 份“靈感”了。

當然,我們可以用一大堆if-then-elses的語句或幾個case來編寫計算程式,讓它計算某個指定日期是 星期幾。

不過我更喜歡基姆拉爾森在本月的“演算法小徑”中為我們帶來的新技巧,因為他的方法另闢蹊徑,從一個全新的方向著 手解決日期計算的問題。

其實,並沒有什麼數學公式能算出某個指定日期是星期幾,不過我們可以試著拼湊一個,如果 我們的嘗試成功了,你就能擁有一個易於程式設計的數學公式,並能用它自動計算哪天是星期幾了。

順便說一句,如果你已經設計出更巧妙的演算法,或是在已有的方法上有了新突破的話,不妨告訴我,我一定洗耳恭聽。

我的聯絡方法是[email protected],或者在djj編輯部給我留張便條就行。

你有沒有疑惑過你的電腦怎麼就知道今天是星期三呢?就算你的電腦關機了,你重啟後設定了新日期,它也能立即知道 這天是星期幾。

在你還是個孩子的時候,你可能見過一種紀錄記錄著年,月,日的**,只要加上幾個數字,和它相連的另一張**就 會告訴你這個日期是星期幾。

當然,計算機硬碟的作業系統裡也可以加入這樣的計算表。

不過有一種簡單的方法可以輕 鬆地算出某天是星期幾;而且這個方法只佔用很少的記憶體空間,而那些只能推算幾百年的**可就太佔地方了。

如果目前你的電腦還不具備推算與日期對應的星期數的功能,現在就不妨在自己的程式中試試下面的公式。

建立公式 首先,我們要用變數d,m和y來表示日期。

比如,1994年3月1日就用“d=1,m=3,y=4”記錄。

我們的目標是讓計算結 果在0到6之間。

0代表星期一,1代表星期二,2代表星期三,依此類推。

1994年3月1日是個星期二,那麼“dmod7(日期變數除以7的餘數))))”這個公式對於整個三月份都有效。

比如3月18日 是星期五,18mod7=4;而4正代表星期五。

別忘了,整數的除法和求模有著密切的關係。

比方說,26除以7商3餘5,這 就是說,26除以7商數取整等於3,而26除以7求模(簡寫為26mod7)等於5。

以上這些意味著19mod7=12mod7=5 mod7=5。

在運算規則中,負數求模運演算法相似,所以依此類推,-2mod7=5,-9mod7=5。

在更正式的表達法中,統一用任意整數n和k表達上述關係,那麼這個過程可以表達為n=qk+r,這裡的q和r的取值範圍同 樣是整數和0。

表1中列出了所有月份的變換資料(shiftinformation此處試譯為“檔級資料”,還請進一步校對--譯 者注)。

為了儘可能地得出規律,二月被排在最後,同理,一月也是如此。

例1(a)中的公式是仿照表1中的變換資料欄所描述的模式而建立的。

這個公式中的除法一律是商數取整。

所以得數是最 接近真正商數的整數。

表2得出了此功能得出的有趣的數值。

憑直覺,我們不難發現,當m(代表月份的變數)的值以1為單 位遞增時,2m就成倍增長,而3(m+1)/5就以3/5為增長倍數。

這正是我們仿製3,2,3,2,3這個重複格式所需要的(表中右邊的彎括號表明了這一點)。

請注意,我們在以7為除數求模 ,那麼從6到2的求模結果就會逐個增加3(順序是6,0,1,2)。

現在,我們發現了適用於逐月向下推算的校正方法,並希望把它加入剛才的嘗試中,就是那個mod7公式。

還以1994年3月 1日為例,這個日期的m=3。

請注意,在例1(b)中,8mod7=1,所以當整個公式合併時,必須減去1。

在做以7為除數 求模的運算時,減1和加6是一樣的,因為-1mod7=6mod7=6。

這樣,例1(c)中的公式就可以計算這一年中剩下的月份了。

其實,既然我們把一月和二月排在表1的最後,那麼只要我 們把它們看成是十三月和十四月,就能接著推算1995年的前兩個月了。

這是因為,雖然它們並不是一個完整的3,2,3,2,3 結構,但恰好可以是這個結構的開始,為了使這個公式更完善,我們還是最好把一月和二月看成是上一年的十三月和十 四月。

加入年份 順著年份向下找,我們觀察到1995年3月1日是星期三。

這說明,每增加一年,我們公式的計算結果就會增加1。

這太簡單 了,我們只要簡單地把年份加上去就行了。

再提醒你一次,我們必須確保出發點是正確的。

由於1994mod7=6,我們在 把y加入已有的公式時就必須減去6。

由此改進的例2(a)就更完善了。

1996年是個閏年,這帶來了我們的下一個問題。

這一年的3月1日是星期五,而不是剛才的公式推算出的星期四。

所以每 當我們碰上閏年時還得多加上1。

判斷閏年的規則是,能被4整除,並能被100和400同時整除的年份就是閏年。

就這樣, 我們在原有的基礎上新增y/4--y/100+y/400。

再強調一下,我們必須從一開始就確保正確。

既然(1994/4-- 1994/100+1994/400)mod7=(498--19+4)mod7=483mod7=0,所以就不用再做任何調整了。

這樣,例2(b)就是我們最終 的成果了。

這個公式能一直工作下去,除非改變現行的日曆系統。

作為示例,讓我們試著推算一下2000年7月4日: (4+2*3+(7+1)/5+2000+2000/4--2000/100+2000/400)mod7=(4+14+2000+500--20+5)mod7=2507mod7=1,所以那一 天是星期二。

這個公式還能推算過去的日期;然而計算範圍有限,讓我們看看1752年9月14號這個星期四吧,我們的公式最遠只能推算 到這裡了。

不過像“1963年11月22日你在**”這樣的日常問題中提到的日期還是可以輕鬆應對的:(22+2*11+3 (11+1)/5+1963+1963/4--1963/100+1963/400)mod7=(22+22+7+1963+490--19+4)mod7=2489mod7=4。

那天就是星期 五。

例3例子3是一個c語言程式,按照把這個公式自動推算給定日期是星期幾。

表1:每月變換資料 月份        天數        變換 三月         31           3 四月         30           2 五月         31           3 六月         30           2 七月         31           3 八月         31           3 九月         30           2 十月         31           3 十一月       30           2 十二月       31           3 一月         31           3 二月         28           3 表2:仿製變換資料形式的功能。

例1中建立的公式可以適用於1994年。

例2把這個公式的功能擴充套件到可以應用在不同的年 份進行推算。

例3:用c語言程式表達上述公式 01./*一月和二月被當作前一年的*/ 02. 03./*十三月和十四月分別處理*/ 04. 05. 06./*計算指定日期是星期幾。

預設輸入的*/ 07. 08./*數字代表正確的日期*/ 09. 10./*推算給定日期是星期幾,假定輸入是正確的資料*/ 11.#include 12.char*name=; 20.voidmain() 21. 36.a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 37.printf("it'sa%s./n",name[a]); 38.} 39. 40. 41. 42. 43. 44./*一月和二月被當作前一年的*/ 快速計算某個日期是星期幾的經驗公式巧算星期幾基姆。

拉爾森基姆擁有計算機學科的博士學位。

他對資料庫,演算法和資料結構有著濃厚的興趣。

他的聯絡地址是原文為丹麥文譯者注... 相關推薦 2812從內部flash啟動的過程 什麼是位元組對齊,為什麼要對齊 命令列視窗設定 快速計算某個日期是星期幾的經驗公式 初步認識迭代伺服器和併發伺服器 相關推薦 2812從內部flash啟動的過程 什麼是位元組對齊,為什麼要對齊 命令列視窗設定 快速計算某個日期是星期幾的經驗公式 初步認識迭代伺服器和併發伺服器 相關閱讀 2812從內部flash啟動的過程 什麼是位元組對齊,為什麼要對齊 命令列視窗設定 快速計算某個日期是星期幾的經驗公式 初步認識迭代伺服器和併發伺服器 開發板基本知識 topic 科技 教育 python 社會 linux 數碼 java c++ 遊戲 演算法 資料庫 健康 文化 mysql 汽車 娛樂 科學 財經 資料結構 C語言 職場 php oracle c# C 作業系統 工作 體育 sql 網路



請為這篇文章評分?