C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
我們知道,公歷的平年是365天,閏年是366天。置閏的方法是能被4整除的年份在2月加一天,但能被100整除的不閏,能被400整除的又閏。因此,像1600、2000、2400年都是閏年,而1700、1800、1900、2100年都是平年。公元前1年,按公歷也是閏年。
因此,對于從公元前1年(或公元0年)12月31日到某一日子的年份Y之間的所有整年中的閏年數,就等于
[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400],
[...]表示只取整數部分。第一項表示需要加上被4整除的年份數,第二項表示需要去掉被100整除的年份數,第三項表示需要再加上被400整除的年份數。之所以Y要減一,這樣,我們就得到了第一個計算某一天是星期幾的公式:
W?=?(Y-1)*365?+?[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400]?+?D.?(1)
其中D是這個日子在這一年中的累積天數。算出來的W就是公元前1年(或公元0年)12月31日到這一天之間的間隔日數。把W用7除,余數是幾,這一天就是星期幾。比如我們來算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,余數為六,說明這一天是星期六。這和事實是符合的。
上面的公式(1)雖然很準確,但是計算出來的數字太大了,使用起來很不方便。仔細想想,其實這個間隔天數W的用處僅僅是為了得到它除以7之后的余數。這啟發我們是不是可以簡化這個W值,只要找一個和它余數相同的較小的數來代替,用數論上的術語來說,就是找一個和它同余的較小的正整數,照樣可以計算出準確的星期數。
顯然,W這么大的原因是因為公式中的第一項(Y-1)*365太大了。其實,
(Y-1)*365?=?(Y-1)?*?(364+1)
=?(Y-1)?*?(7*52+1)
=?52?*?(Y-1)?*?7?+?(Y-1),
這個結果的第一項是一個7的倍數,除以7余數為0,因此(Y-1)*365除以7的余數其實就等于Y-1除以7的余數。這個關系可以表示為:
(Y-1)*365?≡?Y-1?(mod?7).
其中,≡是數論中表示同余的符號,mod?7的意思是指在用7作模數(也就是除數)的情況下≡號兩邊的數是同余的。因此,完全可以用(Y-1)代替(Y-1)*365,這樣我們就得到了那個著名的、也是最常見到的計算星期幾的公式:
W?=?(Y-1)?+?[(Y-1)/4]?-?[(Y-1)/100]?+?[(Y-1)/400]?+?D.?(2)
這個公式雖然好用多了,但還不是最好用的公式,因為累積天數D的計算也比較麻煩。是不是可以用月份數和日期直接計算呢?答案也是肯定的。我們不妨來觀察一下各個月的日數,列表如下:
月 份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
--------------------------------------------------------------------------
天 數:?31?28(29)?31?30?31?30?31?31?30?31?30?31
如果把這個天數都減去28(=4*7),不影響W除以7的余數值。這樣我們就得到另一張表:
月 份:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
------------------------------------------------------------------------
剩余天數:?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
仔細觀察的話,我們會發現除去1月和2月,3月到7月這五個月的剩余天數值是3,2,3,2,3;8月到12月這五個月的天數值也是3,2,3,2,3,正好是一個重復。相應的累積天數中,后一月的累積天數和前一月的累積天數之差減去28就是這個重復。正是因為這種規律的存在,平年和閏年的累積天數可以用數學公式很方便地表達:
╭?d; ? (當M=1)
D?=?{?31?+?d; ? ?(當M=2)? ?(3)
╰?[?13?*?(M+1)?/?5?]?-?7?+?(M-1)?*?28?+?d?+?i. ?(當M≥3)
其中[...]仍表示只取整數部分;M和d分別是想算的日子的月份和日數;平年i=0,閏年=1。對于M≥3的表達式需要說明一下:[13*(M+1)/5]-7算出來的就是上面第二個表中的平年累積值,再加上(M-1)*28就是想算的日子的月份之前的所有月份的總天數。這是一個很巧妙的辦法,利用取整運算來實現3,2,3,2,3的循環。比如,對2004年5月1日,有:
總結
以上是生活随笔為你收集整理的C语言中如何求一天是星期几,计算任何一天是星期几的C语言源代码.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keil uvision2 c语言调试,
- 下一篇: c语言用fun求矩阵,C语言通过函数调用