c語言詳解  蔡勒(Zeller)公式計算某一天是星期幾  極其方便

來源:互聯網
上載者:User

標籤:

    1. —— 蔡勒(Zeller)公式

      曆史上的某一天是星期幾?未來的某一天是星期幾?關於這個問題,有很多計算公式(兩個通用計算公式和一些分段計算公式),其中最著名的是蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

      公式中的符號含義如下,w:星期;c:世紀-1;y:年(兩位元);m:月(m大於等於3,小於等於14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計算,比如2003年1月1日要看作2002年的13月1日來計算);d:日;[]代表取整,即只要整數部分。(C是世紀數減一,y是年份後兩位,M是月份,d是日數。1月和2月要按上一年的13月和14月來算,這時C和y均按上一年取值。)

      算出來的W除以7,餘數是幾就是星期幾。如果餘數是0,則為星期日。

      以2049年10月1日(100周年國慶)為例,用蔡勒(Zeller)公式進行計算,過程如下:
      蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
      =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
      =49+[12.25]+5-40+[28.6]
      =49+12+5-40+28
      =54(除以7餘5)
      即2049年10月1日(100周年國慶)是星期5。

      你的生日(出生時、今年、明年)是星期幾?不妨試一試。

      不過,以上公式只適合於1582年10月15日之後的情形(當時的羅馬教皇將愷撒大帝制訂的儒略曆修改成格里曆,即今天使用的西曆)。

      過程的推導:(對推理不感興趣的可略過不看)

      星期制度是一種有古老傳統的制度。據說因為《聖經·創世紀》中規定上帝用了六
      天時間創世紀,第七天休息,所以人們也就以七天為一個周期來安排自己的工作和生
      活,而星期日是休息日。從實際的角度來講,以七天為一個周期,長短也比較合適。所
      以儘管中國的傳統工作周期是十天(比如王勃《滕王閣序》中說的“十旬休暇”,即是
      指官員的工作每十日為一個周期,第十日休假),但後來也採取了西方的星期制度。

        在日常生活中,我們常常遇到要知道某一天是星期幾的問題。有時候,我們還想知
      道曆史上某一天是星期幾。通常,解決這個方法的有效辦法是看日曆,但是我們總不會
      隨時隨身帶著日曆,更不可能隨時隨身帶著幾千年的萬年曆。假如是想在電腦編程中
      計算某一天是星期幾,預先把一本萬年曆存進去就更不現實了。這時候是不是有辦法通
      過什麼公式,從年月日推出這一天是星期幾呢?

        答案是肯定的。其實我們也常常在這樣做。我們先舉一個簡單的例子。比如,知道
      了2004年5月1日是星期六,那麼2004年5月31日“世界無煙日”是星期幾就不難推算出
      來。我們可以掰著指頭從1日數到31日,同時數星期,最後可以數出5月31日是星期一。
      其實運用數學計算,可以不用掰指頭。我們知道星期是七天一輪迴的,所以5月1日是星
      期六,七天之後的5月8日也是星期六。在日期上,8-1=7,正是7的倍數。同樣,5月15
      日、5月22日和5月29日也是星期六,它們的日期和5月1日的差值分別是14、21和28,也
      都是7的倍數。那麼5月31日呢?31-1=30,雖然不是7的倍數,但是31除以7,餘數為2,
      這就是說,5月31日的星期,是在5月1日的星期之後兩天。星期六之後兩天正是星期一。

        這個簡單的計算告訴我們計算星期的一個基本思路:首先,先要知道在想算的日子
      之前的一個確定的日子是星期幾,拿這一天做為推算的標準,也就是相當於一個計算的
      “原點”。其次,知道想算的日子和這個確定的日子之間相差多少天,用7除這個日期
      的差值,餘數就表示想算的日子的星期在確定的日子的星期之後多少天。如果餘數是
      0,就表示這兩天的星期相同。顯然,如果把這個作為“原點”的日子選為星期日,那
      麼餘數正好就等於星期幾,這樣計算就更方便了。

        但是直接計算兩天之間的天數,還是不免繁瑣。比如1982年7月29日和2004年5月
      1日之間相隔7947天,就不是一下子能算出來的。它包括三段時間:一,1982年7月29
      日以後這一年的剩餘天數;二,1983-2003這二十一個整年的全部天數;三,從2004年
      元旦到5月1日經過的天數。第二段比較好算,它等於21*365+5=7670天,之所以要加
      5,是因為這段時間內有5個閏年。第一段和第三段就比較麻煩了,比如第三段,需要把
      5月之前的四個月的天數累加起來,再加上日期值,即31+29+31+30+1=122天。同理,第
      一段需要把7月之後的五個月的天數累加起來,再加上7月剩下的天數,一共是155天。
      所以總共的相隔天數是122+7670+155=7947天。

        仔細想想,如果把“原點”日子的日期選為12月31日,那麼第一段時間也就是一個
      整年,這樣一來,第一段時間和第二段時間就可以合并計算,整年的總數正好相當於兩
      個日子的年份差值減一。如果進一步把“原點”日子選為公元前1年12月31日(或者天文
      學家所使用的公元0年12月31日),這個整年的總數就正好是想算的日子的年份減一。這
      樣簡化之後,就只須計算兩段時間:一,這麼多整年的總天數;二,想算的日子是這一
      年的第幾天。巧的是,按照西曆的年月設定,這樣反推回去,公元前1年12月31日正好是
      星期日,也就是說,這樣算出來的總天數除以7的餘數正好是星期幾。那麼現在的問題就
      只有一個:這麼多整年裡面有多少閏年。這就需要瞭解西曆的置閏規則了。

        我們知道,西曆的平年是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,餘數為六,說明這一天是星期六。這和事實是符合的。


    2. /* 蔡勒(Zeller)公式計算某一天是星期幾 w:星期;c:(年份前兩位);y:年(年份後兩位);m:月(m大於等於3,小於等於14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月 來計算,比如2003年1月1日要看作2002年的13月1日來計算);d:日 算出來的W除以7,餘數是幾就是星期幾。*/
      #include<stdio.h>
      int main()
      {
      int y,c,m,d,w,year,month,day;
      printf("請輸入一個日期:\n");
      scanf("%d%d%d",&year,&month,&day);
      y=year%100;//年 如2015 即年是15年
      c=year/100;// 年份前兩位 如2015即20
      m=month;
      if (m ==1 || m == 2) { //判斷月份是否為1或2
      y--;
      m += 12;//某年的1、2月要看作上一年的13、14月來計算
      }
      w=y+y/4+c/4-2*c+13*(m+1)/5+d;//蔡勒公式的公式
      while (w < 0) w += 7;//確保餘數為正
      w%=7;
      printf("輸入的日期是星期%d",w);
      }

c語言詳解  蔡勒(Zeller)公式計算某一天是星期幾  極其方便

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.