C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.
該樓層疑似違規(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keil uvision2 c语言调试,
- 下一篇: c语言用fun求矩阵,C语言通过函数调用