日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.

發(fā)布時(shí)間:2024/1/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码. 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓

我們知道,公歷的平年是365天,閏年是366天。置閏的方法是能被4整除的年份在2月加一天,但能被100整除的不閏,能被400整除的又閏。因此,像1600、2000、2400年都是閏年,而1700、1800、1900、2100年都是平年。公元前1年,按公歷也是閏年。

因此,對于從公元前1年(或公元0年)12月31日到某一日子的年份Y之間的所有整年中的閏年數(shù),就等于

[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400],

[...]表示只取整數(shù)部分。第一項(xiàng)表示需要加上被4整除的年份數(shù),第二項(xiàng)表示需要去掉被100整除的年份數(shù),第三項(xiàng)表示需要再加上被400整除的年份數(shù)。之所以Y要減一,這樣,我們就得到了第一個(gè)計(jì)算某一天是星期幾的公式:

W?=?(Y-1)*365?+?[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400]?+?D.?(1)

其中D是這個(gè)日子在這一年中的累積天數(shù)。算出來的W就是公元前1年(或公元0年)12月31日到這一天之間的間隔日數(shù)。把W用7除,余數(shù)是幾,這一天就是星期幾。比如我們來算2004年5月1日:

W?=?(2004-1)*365?+?[(2004-1)/4]?-?[(2004-1)/100]?+?[(2004-1)/400]?+31+29+31+30+1)

=?731702,

731702?/?7?=?104528……6,余數(shù)為六,說明這一天是星期六。這和事實(shí)是符合的。

上面的公式(1)雖然很準(zhǔn)確,但是計(jì)算出來的數(shù)字太大了,使用起來很不方便。仔細(xì)想想,其實(shí)這個(gè)間隔天數(shù)W的用處僅僅是為了得到它除以7之后的余數(shù)。這啟發(fā)我們是不是可以簡化這個(gè)W值,只要找一個(gè)和它余數(shù)相同的較小的數(shù)來代替,用數(shù)論上的術(shù)語來說,就是找一個(gè)和它同余的較小的正整數(shù),照樣可以計(jì)算出準(zhǔn)確的星期數(shù)。

顯然,W這么大的原因是因?yàn)楣街械牡谝豁?xiàng)(Y-1)*365太大了。其實(shí),

(Y-1)*365?=?(Y-1)?*?(364+1)

=?(Y-1)?*?(7*52+1)

=?52?*?(Y-1)?*?7?+?(Y-1),

這個(gè)結(jié)果的第一項(xiàng)是一個(gè)7的倍數(shù),除以7余數(shù)為0,因此(Y-1)*365除以7的余數(shù)其實(shí)就等于Y-1除以7的余數(shù)。這個(gè)關(guān)系可以表示為:

(Y-1)*365?≡?Y-1?(mod?7).

其中,≡是數(shù)論中表示同余的符號,mod?7的意思是指在用7作模數(shù)(也就是除數(shù))的情況下≡號兩邊的數(shù)是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,這樣我們就得到了那個(gè)著名的、也是最常見到的計(jì)算星期幾的公式:

W?=?(Y-1)?+?[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400]?+?D.?(2)

這個(gè)公式雖然好用多了,但還不是最好用的公式,因?yàn)槔鄯e天數(shù)D的計(jì)算也比較麻煩。是不是可以用月份數(shù)和日期直接計(jì)算呢?答案也是肯定的。我們不妨來觀察一下各個(gè)月的日數(shù),列表如下:

月  份:1月 2月  3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

--------------------------------------------------------------------------

天  數(shù):?31?28(29)?31?30?31?30?31?31?30?31?30?31

如果把這個(gè)天數(shù)都減去28(=4*7),不影響W除以7的余數(shù)值。這樣我們就得到另一張表:

月  份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

------------------------------------------------------------------------

剩余天數(shù):?3?0(1)?3?2?3?2?3?3?2?3?2?3

平年累積:?3?3?6?8?11?13?16?19?21?24?26?29

閏年累積:?3?4?7?9?12?14?17?20?22?25?27?30

仔細(xì)觀察的話,我們會(huì)發(fā)現(xiàn)除去1月和2月,3月到7月這五個(gè)月的剩余天數(shù)值是3,2,3,2,3;8月到12月這五個(gè)月的天數(shù)值也是3,2,3,2,3,正好是一個(gè)重復(fù)。相應(yīng)的累積天數(shù)中,后一月的累積天數(shù)和前一月的累積天數(shù)之差減去28就是這個(gè)重復(fù)。正是因?yàn)檫@種規(guī)律的存在,平年和閏年的累積天數(shù)可以用數(shù)學(xué)公式很方便地表達(dá):

╭?d;               ? (當(dāng)M=1)

D?=?{?31?+?d;         ?  ?(當(dāng)M=2)?         ?(3)

╰?[?13?*?(M+1)?/?5?]?-?7?+?(M-1)?*?28?+?d?+?i. ?(當(dāng)M≥3)

其中[...]仍表示只取整數(shù)部分;M和d分別是想算的日子的月份和日數(shù);平年i=0,閏年=1。對于M≥3的表達(dá)式需要說明一下:[13*(M+1)/5]-7算出來的就是上面第二個(gè)表中的平年累積值,再加上(M-1)*28就是想算的日子的月份之前的所有月份的總天數(shù)。這是一個(gè)很巧妙的辦法,利用取整運(yùn)算來實(shí)現(xiàn)3,2,3,2,3的循環(huán)。比如,對2004年5月1日,有:

總結(jié)

以上是生活随笔為你收集整理的C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。