青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 87  文章 - 279  trackbacks - 0
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

潛心看書研究!

常用鏈接

留言簿(19)

隨筆分類(81)

文章分類(89)

相冊

ACM OJ

My friends

搜索

  •  

積分與排名

  • 積分 - 220442
  • 排名 - 118

最新評論

閱讀排行榜

評論排行榜


巧算星期幾

基姆。拉爾森

基姆擁有計算機學科的博士學位。他對數據庫,算法和數據結構有著濃厚的興趣。他的聯系地址是??????????? (原文為丹麥文--譯者注) 31,DK-5270,Odense N,Denmark,或發 E-mail 至 :kslarsen@imada.ou.dk。

簡介

布魯斯 施耐爾

?

“四,六,九,十一,三十天就齊……”兒歌是這么唱的;或許你也曾經掰著手指頭翻來覆去地數,讓趕上單數的指頭代表只有30天的短月吧?這樣的口訣對我們是很管用的(我就是念叨著這首傻乎乎的兒歌長大的),可是電腦就沒有這份“靈感”了。當然,我們可以用一大堆IF-THEN-ELSES的語句或幾個CASE來編寫計算程序,讓它計算某個指定日期是星期幾。

?

不過我更喜歡基姆拉爾森在本月的“算法小徑”中為我們帶來的新技巧,因為他的方法另辟蹊徑,從一個全新的方向著手解決日期計算的問題。其實,并沒有什么數學公式能算出某個指定日期是星期幾,不過我們可以試著拼湊一個,如果我們的嘗試成功了,你就能擁有一個易于編程的數學公式,并能用它自動計算哪天是星期幾了。

?

順便說一句,如果你已經設計出更巧妙的算法,或是在已有的方法上有了新突破的話,不妨告訴我,我一定洗耳恭聽。我的聯系方法是schneier@chinet.com,或者在DJJ編輯部給我留張便條就行。

?

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

?

在你還是個孩子的時候,你可能見過一種紀錄記錄著年,月,日的表格,只要加上幾個數字,和它相連的另一張表格就會告訴你這個日期是星期幾。當然,計算機硬盤的操作系統里也可以加入這樣的計算表。不過有一種簡單的方法可以輕松地算出某天是星期幾;而且這個方法只占用很少的內存空間,而那些只能推算幾百年的表格可就太占地方了。

?

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

?

?

創建公式

?

首先,我們要用變量D,M和Y來表示日期。比如,1994年3月1日就用“D=1,M=3,Y=4”記錄。我們的目標是讓計算結果在0到6之間。0代表星期一,1代表星期二,2代表星期三,依此類推。

?

1994年3月1日是個星期二,那么“D mod 7(日期變量除以7的余數))))”這個公式對于整個三月份都有效。比如3月18日是星期五,18 mod 7=4;而4正代表星期五。別忘了,整數的除法和求模有著密切的關系。比方說,26除以7商3余5,這就是說,26除以7商數取整等于3,而26除以7求模(簡寫為26 mod 7)等于5。以上這些意味著19 mod 7=12 mod 7= 5 mod 7=5。在運算規則中,負數求模運算法相似,所以依此類推,-2 mod 7=5, -9 mod 7=5。

?

在更正式的表達法中,統一用任意整數n和k表達上述關系,那么這個過程可以表達為n=qk+r,這里的q和r的取值范圍同樣是整數和0。表1中列出了所有月份的變換數據(shift information此處試譯為“檔級數據”,還請進一步校對--譯者注)。為了盡可能地得出規律,二月被排在最后,同理,一月也是如此。

?

例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)中,8 mod 7=1,所以當整個公式合并時,必須減去1。在做以7為除數求模的運算時,減1和加6是一樣的,因為-1 mod 7=6 mod 7=6。

?

這樣,例1(c)中的公式就可以計算這一年中剩下的月份了。其實,既然我們把一月和二月排在表1的最后,那么只要我們把它們看成是十三月和十四月,就能接著推算1995年的前兩個月了。這是因為,雖然它們并不是一個完整的3,2,3,2,3結構,但恰好可以是這個結構的開始,為了使這個公式更完善,我們還是最好把一月和二月看成是上一年的十三月和十四月。

?

?

加入年份

?

順著年份向下找,我們觀察到1995年3月1日是星期三。這說明,每增加一年,我們公式的計算結果就會增加1。這太簡單了,我們只要簡單地把年份加上去就行了。再提醒你一次,我們必須確保出發點是正確的。由于1994 mod 7=6,我們在把Y加入已有的公式時就必須減去6。由此改進的例2(a)就更完善了。

?

1996年是個閏年,這帶來了我們的下一個問題。這一年的3月1日是星期五,而不是剛才的公式推算出的星期四。所以每當我們碰上閏年時還得多加上1。判斷閏年的規則是,能被4整除,并能被100和400同時整除的年份就是閏年。就這樣,我們在原有的基礎上添加Y/4--Y/100+Y/400。再強調一下,我們必須從一開始就確保正確。既然(1994/4--1994/100+1994/400) mod 7=(498--19+4) mod 7=483 mod 7=0,所以就不用再做任何調整了。這樣,例2(b)就是我們最終的成果了。這個公式能一直工作下去,除非改變現行的日歷系統。作為示例,讓我們試著推算一下2000年7月4日:(4+2*3+(7+1)/5+2000+2000/4--2000/100+2000/400) mod 7= (4+14+2000+500--20+5) mod 7=2507 mod 7=1,所以那一天是星期二。

?

這個公式還能推算過去的日期;然而計算范圍有限,讓我們看看1752年9月14號這個星期四吧,我們的公式最遠只能推算到這里了。不過像“1963年11月22日你在哪里”這樣的日常問題中提到的日期還是可以輕松應對的:(22+2*11+3(11+1)/5+1963+1963/4--1963/100+1963/400) mod 7=(22+22+7+1963+490--19+4) mod 7=2489 mod 7=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語言程序表達上述公式

/*計算指定日期是星期幾。默認輸入的*/

/*數字代表正確的日期*/

/* 推算給定日期是星期幾,假定輸入是正確的數據 */
#include
char *name[] = { "Monday",
???????????????? "Tuesday",
???????????????? "Wednesday",
??????????????? "Thursday",
??????????????? "Friday",
??????????????? "Saturday",
??????????????? "Sunday"
?????????????? };
void main(){
? int D,M,Y,A;
? printf("Day: "); fflush(stdout);
? scanf("%d",&D);
? printf("Month: "); fflush(stdout);
? scanf("%d",&M);
? printf("Year: "); fflush(stdout);
? scanf("%d",&Y);
/* January and February are treated as month 13 and 14, */
/* respectively, from the year before.????????????????? */
? if ((M == 1) || (M == 2)){
??? M += 12;
??? Y--;
? }
? A = (D + 2*M + 3*(M+1)/5 + Y + Y/4 - Y/100 + Y/400) % 7;
? printf("It's a %s.\n",name[A]);
}

?

?

/*一月和二月被當作前一年的*/

/*十三月和十四月分別處理*/

?

?
?
?

posted on 2006-10-22 23:30 閱讀(3873) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構與算法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美视频在线观看免费网址| 欧美激情国产日韩| 亚洲另类一区二区| 亚洲精品系列| 在线视频亚洲一区| av成人毛片| 亚洲欧美一级二级三级| 亚洲一区二区高清视频| 久久狠狠久久综合桃花| 浪潮色综合久久天堂| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久中文在线| 亚洲巨乳在线| 亚洲午夜精品久久久久久浪潮| 欧美在线视频免费| 老司机成人网| 欧美三级电影大全| 狠狠干综合网| 中文久久精品| 欧美3dxxxxhd| 亚洲午夜电影网| 久久午夜视频| 国产精品人成在线观看免费| 1000部国产精品成人观看| 亚洲天堂成人在线观看| 欧美 亚欧 日韩视频在线| 日韩亚洲国产欧美| 蜜桃久久精品乱码一区二区| 国产精品色网| 一本一道久久综合狠狠老精东影业| 欧美伊人影院| 亚洲免费观看| 女主播福利一区| 国产亚洲精品美女| 亚洲午夜伦理| 亚洲激情av| 亚洲一区精彩视频| 欧美久久在线| 亚洲精品国产系列| 久久视频这里只有精品| 一本一本a久久| 欧美精品少妇一区二区三区| 在线观看成人一级片| 欧美一区二区三区视频在线 | 欧美α欧美αv大片| 亚洲自拍偷拍麻豆| 欧美日本韩国| 在线欧美日韩| 久久久久一区| 亚洲欧美日韩区| 亚洲美女中文字幕| 久久一区精品| 国产综合香蕉五月婷在线| 亚洲专区免费| 一级日韩一区在线观看| 欧美国产精品一区| 亚洲第一福利社区| 农村妇女精品| 麻豆国产精品va在线观看不卡 | 国模 一区 二区 三区| 性做久久久久久久久| 一区二区电影免费观看| 欧美日韩亚洲一区二区| 亚洲精品一区二区三区婷婷月| 欧美国产精品va在线观看| 裸体一区二区| 亚洲精品国久久99热| 亚洲美女区一区| 国产精品地址| 久久国产精品一区二区三区四区 | 在线综合欧美| 亚洲少妇一区| 国产精品热久久久久夜色精品三区| 亚洲摸下面视频| 午夜宅男久久久| 国外成人在线视频| 欧美福利视频一区| 欧美精品在线一区| 亚洲综合欧美| 久久综合成人精品亚洲另类欧美| 91久久中文| 日韩亚洲欧美综合| 国产欧美另类| 欧美不卡视频一区发布| 欧美精品九九| 午夜国产精品影院在线观看| 欧美在线观看你懂的| 91久久精品美女高潮| 日韩一区二区精品视频| 国产日韩精品入口| 亚洲国产精品精华液2区45 | 国产精品自拍小视频| 蜜臀av国产精品久久久久| 欧美精品手机在线| 久久久在线视频| 欧美理论片在线观看| 久久久久久香蕉网| 欧美日韩国产专区| 老司机精品视频一区二区三区| 欧美www视频| 久久精品91| 国产精品成人在线观看| 亚洲第一成人在线| 国产自产v一区二区三区c| 亚洲免费观看高清完整版在线观看熊 | 久久久久久久久久久久久9999| 夜夜嗨一区二区三区| 久久精品国产久精国产思思| 在线视频你懂得一区二区三区| 欧美一级专区免费大片| 一区二区日韩伦理片| 久久久久一区二区| 久久精品99国产精品酒店日本| 欧美日韩国产综合一区二区| 欧美成人一区二区三区在线观看| 国产酒店精品激情| 亚洲裸体视频| 亚洲精品综合久久中文字幕| 久久国产精品亚洲va麻豆| 午夜精品久久久久影视| 欧美日本精品在线| 亚洲国产日韩欧美| 亚洲国产精品久久久久| 久久大香伊蕉在人线观看热2| 亚洲欧美在线一区| 欧美视频第二页| 亚洲精品久久久久久下一站| 亚洲日本va在线观看| 久色成人在线| 欧美sm重口味系列视频在线观看| 国产在线一区二区三区四区| 午夜精品久久久久久久99樱桃 | 亚洲视频免费观看| 欧美日韩免费在线| 亚洲免费观看| 亚洲一区二区3| 国产精品高潮呻吟视频| 亚洲天堂免费观看| 欧美丝袜第一区| 中日韩高清电影网| 亚洲女ⅴideoshd黑人| 欧美日韩日日夜夜| 亚洲婷婷国产精品电影人久久| 亚洲男人av电影| 国产欧美日本一区二区三区| 久久精品国产免费观看| 欧美www视频| 99精品99久久久久久宅男| 欧美日韩三级在线| 亚洲综合色在线| 老牛嫩草一区二区三区日本| 亚洲福利一区| 欧美日本亚洲| 亚洲一区日韩| 另类亚洲自拍| 宅男在线国产精品| 国产精品视频99| 久久综合伊人77777蜜臀| 亚洲国产一成人久久精品| 亚洲人体偷拍| 国产欧美精品一区二区三区介绍 | 亚洲欧美制服中文字幕| 在线精品视频一区二区三四| 欧美激情影院| 亚洲精品在线看| 午夜在线成人av| 在线观看日韩av先锋影音电影院| 欧美黄色一级视频| 亚洲尤物在线视频观看| 美女日韩欧美| 亚洲欧美卡通另类91av| 亚洲高清一区二区三区| 国产精品第一区| 久久欧美中文字幕| 亚洲午夜黄色| 亚洲高清中文字幕| 香蕉成人伊视频在线观看| 亚洲国产精品一区二区第四页av| 欧美视频一区在线观看| 乱码第一页成人| 欧美一区二区三区啪啪| 日韩午夜精品| 欧美黄色成人网| 久久久国产精品亚洲一区| 日韩亚洲国产欧美| 国内久久精品视频| 国产精品欧美日韩| 欧美精品一区二区精品网| 久久经典综合| 亚洲一区自拍| 亚洲免费久久| 欧美好吊妞视频| 免费成人av在线看| 久久久久久久久岛国免费| 亚洲尤物在线| 亚洲免费观看高清完整版在线观看| 国精品一区二区三区| 国模吧视频一区| 国产欧美日韩亚州综合| 欧美视频中文字幕|