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

任我行

一天一個腳印......
每日一句:
posts - 54, comments - 218, trackbacks - 1, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

星期推算法

Posted on 2005-10-22 11:50 任我行 閱讀(1560) 評論(0)  編輯 收藏 引用 所屬分類: C++

通常我們只知道生活當天的前后幾天是星期幾,即便是翻日歷,也只能知道有限日期的星期數。那么有沒有一種方法可以讓我們知道任何一天是星期幾呢?有,下面我將向大家介紹一種方法,用以編寫萬年歷的程序。

首先我們必須約定一些法則,我們用Y、M、D分別表示年、月、日,用數字0-6分別表示星期日-星期六,這樣我們就可以開始推導我們的公式了。

我們知道2002年9月1號為星期日,如果我們要想知道2002年9月10號為星期幾,可以這樣算:(0+(10-1))%7=(0+9)%7=2,即星期二。同樣可算得2002年9月20號為:(0+(20-1))%7=(0+19)%7=5,即星期五。但是這樣算需要把日期減1,不太方便,為了解決這個問題,我們可以假設每個月有一個0號,由于2002年9月1號為星期日,那么2002年9月0號為星期六,這樣算9月10號,只需代入10既(6+10)%7=2。事實上,9月0號也就是8月31號,每個月0號的星期數實際上就是每個月1號的前一天的星期數。我把這個星期數稱之為每個月的代碼。有了這個代碼,要算這個月任一天的星期數都好辦了。

以上討論的是一年中每個月的代碼,事實上對于每年也有一個代碼,這個代碼就是每年1月0號(即1月1號的前一天)的星期數,也就是一月份的代碼。如果我們能夠找到每年的代碼之間的關系,那么要計算萬年歷就易如反掌了。

 

(一)推算年的代碼公式

我們都知道,平年一年有365天,即52周多1天。閏年為366天即52周多2天。我們先只考慮平年的情況。

假設第N年的代碼為W,則第N+1年的代碼為(W+1)%7,而第N+K年的代碼則為(W+K)%7。這是因為從第N年到第N+K年共經過了K年,每過一年也就是過了52周余1天,經過K年也就是過了52*K周余K天,將多余的天數K加上第N年的代碼W再對7取模,所得也就是第N+K年的代碼了。

下面我們把閏年也考慮進來。判斷閏年的規則是,能被4整除,并能被100和400同時整除的年份就是閏年。所以從第N年到第N+K年間共有K/4 -K/100+K/400個閏年,而每個閏年有52周余2天,要比平年多余了1天,即共多余了K/4-K/100+K/400天。我們應該把這些天也加進去,所以第N+K年的代碼應為(W+K+K/4-K/100+K/400)%7。

這樣子是不是就考慮完全了呢?并非如此,我們還有兩點沒考慮到。第一點是第N年是不是閏年。如果第N年是閏年的話,它本身就是52周余2天,而我們在上面卻是把它當作平年來計算的,少算了1天,應加上。所以在第N年為閏年的時候上式應為(W+(K+1)+K/4-K/100+K/400)%7。第二點是第N+K年是不是閏年。如果第N+K年是閏年,雖然它有52周余2天,但只有在算第N+(K+1)年的時候,才需要多加它那一天,而在算第N+K年的時候不需要多加這1天,因此我們必須將上式改為(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7(注意千萬不能改為(W+(K+1)+(K/4-K/100+K/400-1))%7=(W+K+K/4-K/100+K/400)%7)。

由此我們可以得出當第N年為閏年時,第N+K年的代碼計算式為:

A=(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7為了方便計算,我們可以取N為0,也就是假設公元元年的代碼為W。因為公元元年也是閏年,符合上式,那么當我們輸入的年份為Y時,此時就有K=Y,也就是說第Y年的代碼為

A=(W+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7接下來的問題就是W究竟是一個什么數了,下面我們就來解決這個問題。

我們已經知道2002年1月1號為星期二,它的前一天為星期一,那也就是說2002年的代碼就是1,由此我們可得

(W+(2002+1)+(2002-1)/4-(2002-1)/100+(2002-1)/400)%7=1

(W+2488)%7=1

(W+3)%7=1

這樣我們就可求得W=5。我們的公式就變成了如下形式

A=(5+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7有了這個公式,我們就可以算公元后任意一年的代碼了,但還不能算公元前的,我們還需要再改進一下,得出公式(1):

(1)Ayear= Y>0 ? (5+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7

: (5 + Y + Y/4 - Y/100 + Y/400) % 7

這樣就OK了。不過這又導致了另一個問題:Y<0時,算得的A有可能小于0。這個問題我們暫且留下,待會再解決。

 

(二)推算月的代碼公式

年的問題解決了,月怎么辦呢?請看下表:

 

月份

代碼

差值

一月

A

0

二月

A+3

3

三月

A+3

3

四月

A+6

6

五月

A+1

1

六月

A+4

4

七月

A+6

6

八月

A+2

2

九月

A+5

5

十月

A

0

十一月

A+3

3

十二月

A+5

5

表中的A為當年的代碼。由這個表我們可以看出,月與月之間也有一定的關系。由此我們可以推出下面的公式(2):

(2)Amonth=M>2 ? (Ayear+2*(M+1)+3*(M+1)/5)%7

: (Ayear+2*(M+2)+3*(M+2)/5)%7

但是上表所反映的僅為平年的情況,若Y為閏年,則在M大于2時,每個月的代碼還需再加1。這可用一個IF語句解決:

(3)if (((Y%4==0 && Y%100!==0) || (Y%400==0)) && M > 2)

Amonth = (Amonth+1)%7;

現在我們回到公式(1)中的問題。如果Y<0時,使得Ayear<0,那么Ayear最小也只能到-6。大家可以看到,當我們將Ayear代入公式(2)時,問題就自然解決了。

 

(三)計算日期

有了上面的公式,當我們輸入日期后,就很容易算出當天為星期幾了,而且可以計算變量允許范圍內的任意一天的星期數。

(4)A = (Amonth+D)%7

(四)寫程序

下面給出該萬年歷的程序,約莫估計,它可從公元前數十億年算到公元后數十億年(即從負十位數到正十位數),而且無一錯漏。

(程序中并沒有對輸入的月份和日期進行出錯處理)

#include <stdio.h>

char *week[] = {"Sunday",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday"};

void main()

{

int Y;

int M;

int D;

int A;

printf("
Enter year:");

scanf("%d",&Y);

printf("
Enter month:");

scanf("%d",&M);

printf("
Enter date:");

scanf("%d",&D);

//下面的四條語句用來計算輸入日期的星期數,是程序的核心部分,缺一不可

A = Y > 0 ? (5 + (Y + 1) + (Y - 1)/4 - (Y - 1)/100 + (Y - 1)/400) % 7

: (5 + Y + Y/4 - Y/100 + Y/400) % 7;

 

A = M > 2 ? (A + 2*(M + 1) + 3*(M + 1)/5) % 7

: (A + 2*(M + 2) + 3*(M + 2)/5) % 7;

 

if (((Y%4 == 0 && Y%100 != 0) || Y%400 == 0) && M>2)

{

A = (A + 1) % 7;

}

A = (A + D) % 7;

printf("
I's a %s.

",week[A]);

}
《轉貼》

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品久久久久久99热软件| 亚洲欧美日本伦理| 久久嫩草精品久久久久| 亚洲欧美日韩电影| 亚洲欧美日韩综合国产aⅴ| 亚洲一区国产视频| 日韩一级不卡| 亚洲一区二区三区视频| 午夜精品偷拍| 久久久久久综合| 欧美国产日本高清在线| 欧美日韩国产首页在线观看| 欧美视频二区| 国产日韩一区二区| 亚洲黄色一区二区三区| 一本久久青青| 久久国产直播| 亚洲国产精品久久久久婷婷884 | 999亚洲国产精| 一本一道久久综合狠狠老精东影业 | 国产精品国产自产拍高清av| 国产一区二区三区成人欧美日韩在线观看 | 蜜桃久久精品一区二区| 欧美精品一区二区久久婷婷| 欧美午夜在线观看| 在线电影欧美日韩一区二区私密| 一区二区激情| 久久亚洲精品视频| 一区二区三区欧美日韩| 另类图片综合电影| 国产日韩欧美成人| 日韩一级成人av| 久久久久久尹人网香蕉| 99视频有精品| 免费黄网站欧美| 国产一区二区电影在线观看| 亚洲天堂av在线免费| 免费亚洲视频| 欧美一区视频在线| 欧美视频一区| 亚洲理论在线| 欧美第一黄网免费网站| 久久九九免费| 国产人久久人人人人爽| 亚洲欧美日本另类| 日韩视频免费观看| 欧美二区不卡| 亚洲欧洲一区二区在线播放| 老巨人导航500精品| 欧美亚洲综合网| 国产精品日本精品| 亚洲欧美一区二区三区极速播放| 9色国产精品| 欧美午夜激情小视频| 亚洲性色视频| 9久草视频在线视频精品| 欧美日韩免费在线视频| 亚洲手机成人高清视频| 99精品国产99久久久久久福利| 欧美国产日韩一区二区在线观看| 亚洲国产精品一区二区www| 免费观看欧美在线视频的网站| 久久成人18免费观看| 激情五月综合色婷婷一区二区| 久久一二三四| 久久成人18免费网站| 久久精品二区| 精品动漫av| 欧美插天视频在线播放| 蜜桃伊人久久| 亚洲最新合集| 亚洲综合色噜噜狠狠| 国产美女一区二区| 久久精品午夜| 久久久久久9999| 亚洲人成在线观看网站高清| 亚洲第一主播视频| 欧美区日韩区| 亚洲欧美一区二区三区极速播放| 欧美一区二区三区电影在线观看| 国内自拍视频一区二区三区 | 在线看片一区| 亚洲欧洲一区二区三区在线观看| 欧美日本精品| 性色av一区二区三区在线观看 | 欧美日韩日本网| 欧美亚洲一区二区三区| 久久精品国产清高在天天线| 亚洲三级毛片| 午夜精品久久久久99热蜜桃导演| 亚洲第一二三四五区| 亚洲国产成人久久| 国产女人aaa级久久久级| 亚洲第一黄色| 国产精品一区视频| 欧美好吊妞视频| 国产精品欧美日韩久久| 欧美成人精品一区二区三区| 欧美亚洲第一页| 欧美成人精品高清在线播放| 国产精品毛片va一区二区三区| 欧美成人免费一级人片100| 欧美午夜精品久久久久久久 | 亚洲男人第一av网站| 亚洲激情视频网| 亚洲欧美日韩一区二区三区在线| 亚洲欧洲精品成人久久奇米网| 亚洲视频在线免费观看| 在线免费观看视频一区| 亚洲一区二区高清| 亚洲美女一区| 老司机一区二区三区| 久久国产精品亚洲77777| 欧美片在线观看| 欧美v日韩v国产v| 国产日韩综合一区二区性色av| 91久久精品日日躁夜夜躁欧美| 国产亚洲精品bt天堂精选| 一本色道久久综合亚洲精品不卡| 伊人久久成人| 久久国产精品久久久久久久久久 | 欧美va天堂| 国内久久婷婷综合| 亚洲欧美日韩另类| 国产人成一区二区三区影院| 欧美日韩精品免费观看视频| 理论片一区二区在线| 国产精品爱久久久久久久| 亚洲国产婷婷| 亚洲激情在线视频| 玖玖玖免费嫩草在线影院一区| 欧美专区日韩专区| 国产欧美精品一区二区三区介绍| av不卡在线| 亚洲影院一区| 国产精品wwwwww| 中文一区字幕| 亚洲欧美日韩综合国产aⅴ| 欧美新色视频| 国产精品99久久久久久久vr| 亚洲午夜av电影| 国产精品h在线观看| 日韩小视频在线观看专区| 一区二区日韩精品| 欧美午夜激情在线| 亚洲女性裸体视频| 久久精品导航| 亚洲国产精品t66y| 欧美成人午夜| 99在线精品观看| 久久av最新网址| 在线观看欧美日韩国产| 欧美大片在线看| 99视频国产精品免费观看| 午夜欧美不卡精品aaaaa| 国产一区二区毛片| 欧美a级大片| 亚洲午夜av| 卡一卡二国产精品| 日韩午夜一区| 国产欧美日韩另类视频免费观看| 久久久精品久久久久| 91久久综合亚洲鲁鲁五月天| 亚洲小视频在线观看| 国外成人在线视频| 欧美成人一区二区在线| 日韩亚洲精品电影| 久久精品国产99国产精品澳门| 尤物精品在线| 欧美三区不卡| 久久精品色图| 99精品视频免费观看视频| 久久久久久亚洲精品杨幂换脸| 亚洲精品1区2区| 国产日本欧美一区二区| 欧美大片在线影院| 新狼窝色av性久久久久久| 亚洲激情在线观看视频免费| 欧美一区二区在线看| 亚洲精品一区在线观看| 国产区在线观看成人精品| 欧美精品黄色| 久久久另类综合| 亚洲午夜一区二区三区| 亚洲高清视频在线| 久久综合久久综合九色| 性色av一区二区三区红粉影视| 亚洲人成在线观看一区二区| 国产欧美日韩在线视频| 欧美日韩中文字幕日韩欧美| 久久亚洲午夜电影| 欧美一区2区三区4区公司二百| 亚洲毛片在线观看| 亚洲国产欧美日韩另类综合| 久久久高清一区二区三区| 亚洲一区一卡| 在线午夜精品自拍| 亚洲日本中文字幕免费在线不卡| 欧美日韩国产一区精品一区| 久久久夜夜夜|