欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
[轉帖]快速計算某個(gè)日期是星期幾的經(jīng)驗公式

巧算星期幾

基姆。拉爾森

基姆擁有計算機學(xué)科的博士學(xué)位。他對數據庫,算法和數據結構有著(zhù)濃厚的興趣。他的聯(lián)系地址是            (原文

為丹麥文--譯者注) 31,DK-5270,Odense N,Denmark,或發(fā) E-mail 至:kslarsen@imada.ou.dk。

簡(jiǎn)介

布魯斯 施耐爾

“四,六,九,十一,三十天就齊……”兒歌是這么唱的;或許你也曾經(jīng)掰著(zhù)手指頭翻來(lái)覆去地數,讓趕上單數的指頭

代表只有30天的短月吧?這樣的口訣對我們是很管用的(我就是念叨著(zhù)這首傻乎乎的兒歌長(cháng)大的),可是電腦就沒(méi)有這

份“靈感”了。當然,我們可以用一大堆IF-THEN-ELSES的語(yǔ)句或幾個(gè)CASE來(lái)編寫(xiě)計算程序,讓它計算某個(gè)指定日期是

星期幾。

不過(guò)我更喜歡基姆拉爾森在本月的“算法小徑”中為我們帶來(lái)的新技巧,因為他的方法另辟蹊徑,從一個(gè)全新的方向著(zhù)

手解決日期計算的問(wèn)題。其實(shí),并沒(méi)有什么數學(xué)公式能算出某個(gè)指定日期是星期幾,不過(guò)我們可以試著(zhù)拼湊一個(gè),如果

我們的嘗試成功了,你就能擁有一個(gè)易于編程的數學(xué)公式,并能用它自動(dòng)計算哪天是星期幾了。

順便說(shuō)一句,如果你已經(jīng)設計出更巧妙的算法,或是在已有的方法上有了新突破的話(huà),不妨告訴我,我一定洗耳恭聽(tīng)。

我的聯(lián)系方法是schneier@chinet.com,或者在DJJ編輯部給我留張便條就行。

你有沒(méi)有疑惑過(guò)你的電腦怎么就知道今天是星期三呢?就算你的電腦關(guān)機了,你重啟后設定了新日期,它也能立即知道

這天是星期幾。

在你還是個(gè)孩子的時(shí)候,你可能見(jiàn)過(guò)一種紀錄記錄著(zhù)年,月,日的表格,只要加上幾個(gè)數字,和它相連的另一張表格就

會(huì )告訴你這個(gè)日期是星期幾。當然,計算機硬盤(pán)的操作系統里也可以加入這樣的計算表。不過(guò)有一種簡(jiǎn)單的方法可以輕

松地算出某天是星期幾;而且這個(gè)方法只占用很少的內存空間,而那些只能推算幾百年的表格可就太占地方了。

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

創(chuàng )建公式

首先,我們要用變量D,M和Y來(lái)表示日期。比如,1994年3月1日就用“D=1,M=3,Y=4”記錄。我們的目標是讓計算結

果在0到6之間。0代表星期一,1代表星期二,2代表星期三,依此類(lèi)推。

1994年3月1日是個(gè)星期二,那么“D mod 7(日期變量除以7的余數))))”這個(gè)公式對于整個(gè)三月份都有效。比如3月18日

是星期五,18 mod 7=4;而4正代表星期五。別忘了,整數的除法和求模有著(zhù)密切的關(guān)系。比方說(shuō),26除以7商3余5,這

就是說(shuō),26除以7商數取整等于3,而26除以7求模(簡(jiǎn)寫(xiě)為26 mod 7)等于5。以上這些意味著(zhù)19 mod 7=12 mod 7= 5

mod 7=5。在運算規則中,負數求模運算法相似,所以依此類(lèi)推,-2 mod 7=5, -9 mod 7=5。

在更正式的表達法中,統一用任意整數n和k表達上述關(guān)系,那么這個(gè)過(guò)程可以表達為n=qk+r,這里的q和r的取值范圍同

樣是整數和0。表1中列出了所有月份的變換數據(shift information此處試譯為“檔級數據”,還請進(jìn)一步校對--譯

者注)。為了盡可能地得出規律,二月被排在最后,同理,一月也是如此。

例1(a)中的公式是仿照表1中的變換數據欄所描述的模式而創(chuàng )建的。這個(gè)公式中的除法一律是商數取整。所以得數是最

接近真正商數的整數。表2得出了此功能得出的有趣的數值。憑直覺(jué),我們不難發(fā)現,當M(代表月份的變量)的值以1為單

位遞增時(shí),2M就成倍增長(cháng),而3(M+1)/5就以3/5為增長(cháng)倍數。

這正是我們仿制3,2,3,2,3這個(gè)重復格式所需要的(表中右邊的彎括號表明了這一點(diǎn))。請注意,我們在以7為除數求模

,那么從6到2的求模結果就會(huì )逐個(gè)增加3(順序是6,0,1,2)。

現在,我們發(fā)現了適用于逐月向下推算的校正方法,并希望把它加入剛才的嘗試中,就是那個(gè)mod7公式。還以1994年3月

1日為例,這個(gè)日期的M=3。請注意,在例1(b)中,8 mod 7=1,所以當整個(gè)公式合并時(shí),必須減去1。在做以7為除數

求模的運算時(shí),減1和加6是一樣的,因為-1 mod 7=6 mod 7=6。

這樣,例1(c)中的公式就可以計算這一年中剩下的月份了。其實(shí),既然我們把一月和二月排在表1的最后,那么只要我

們把它們看成是十三月和十四月,就能接著(zhù)推算1995年的前兩個(gè)月了。這是因為,雖然它們并不是一個(gè)完整的3,2,3,2,3

結構,但恰好可以是這個(gè)結構的開(kāi)始,為了使這個(gè)公式更完善,我們還是最好把一月和二月看成是上一年的十三月和十

四月。

加入年份

順著(zhù)年份向下找,我們觀(guān)察到1995年3月1日是星期三。這說(shuō)明,每增加一年,我們公式的計算結果就會(huì )增加1。這太簡(jiǎn)單

了,我們只要簡(jiǎn)單地把年份加上去就行了。再提醒你一次,我們必須確保出發(fā)點(diǎn)是正確的。由于1994 mod 7=6,我們在

把Y加入已有的公式時(shí)就必須減去6。由此改進(jìn)的例2(a)就更完善了。

1996年是個(gè)閏年,這帶來(lái)了我們的下一個(gè)問(wèn)題。這一年的3月1日是星期五,而不是剛才的公式推算出的星期四。所以每

當我們碰上閏年時(shí)還得多加上1。判斷閏年的規則是,能被4整除,并能被100和400同時(shí)整除的年份就是閏年。就這樣,

我們在原有的基礎上添加Y/4--Y/100+Y/400。再強調一下,我們必須從一開(kāi)始就確保正確。既然(1994/4--

1994/100+1994/400) mod 7=(498--19+4) mod 7=483 mod7=0,所以就不用再做任何調整了。這樣,例2(b)就是我們最終

的成果了。這個(gè)公式能一直工作下去,除非改變現行的日歷系統。作為示例,讓我們試著(zhù)推算一下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,所以那一

天是星期二。

這個(gè)公式還能推算過(guò)去的日期;然而計算范圍有限,讓我們看看1752年9月14號這個(gè)星期四吧,我們的公式最遠只能推算

到這里了。不過(guò)像“1963年11月22日你在哪里”這樣的日常問(wèn)題中提到的日期還是可以輕松應對的:(22+2*11+3

(11+1)/5+1963+1963/4--1963/100+1963/400) mod7=(22+22+7+1963+490--19+4) mod 7=2489 mod 7=4。那天就是星期

五。

例3例子3是一個(gè)C語(yǔ)言程序,按照把這個(gè)公式自動(dòng)推算給定日期是星期幾。

表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把這個(gè)公式的功能擴展到可以應用在不同的年

份進(jìn)行推算。

例3:用C語(yǔ)言程序表達上述公式

 

  1. /*一 月和二月被當作前一年的*/  
  2.   
  3. /*十三月和十四月分別處理*/  
  4.   
  5.   
  6. /*計算指定日期是星期幾。默認輸入的*/  
  7.   
  8. /*數字代表正確的日期*/  
  9.   
  10. /* 推算給定日期是星期幾,假定輸入是正確的數據 */  
  11. #include   
  12. char *name[] = { "Monday",  
  13.                  "Tuesday",  
  14.                  "Wednesday",  
  15.                  "Thursday",  
  16.                  "Friday",  
  17.                  "Saturday",  
  18.                  "Sunday"  
  19.                };  
  20. void main()  
  21. {  
  22.     int D,M,Y,A;  
  23.     printf("Day: "); fflush(stdout);  
  24.     scanf("%d",&D);  
  25.     printf("Month: "); fflush(stdout);  
  26.     scanf("%d",&M);  
  27.     printf("Year: "); fflush(stdout);  
  28.     scanf("%d",&Y);  
  29.     /* January and February are treated as month 13 and 14*/  
  30.     /* respectively, from the year before.*/  
  31.     if ((M == 1) || (M == 2))  
  32.     {  
  33.         M += 12;  
  34.         Y--;  
  35.     }  
  36.     A = (D + 2*M + 3*(M+1)/5 + Y + Y/4 - Y/100 + Y/400) % 7;  
  37.     printf("It's a %s.\n",name[A]);  
  38. }  
  39.   
  40.    
  41.   
  42.    
  43.   
  44. /*一月和二月被當作前一年的*/  

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
60秒輕松計算出任意一年任意一天星期幾?
蔡勒Z(yǔ)eller公式(計算星期的方法) - jx的日志 - 網(wǎng)易博客
蔡勒公式
一個(gè)計算星期幾的簡(jiǎn)單程序
第7章 儒略日
如何快速計算出任意一天是星期幾?有哪些技巧?
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久