国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++算法系列之日歷生成的算法代碼

2020-01-26 13:42:56
字體:
來源:轉載
供稿:網友

日歷在我們的生活中扮演著十分重要的角色,上班、上學、約會都離不開日歷。每年新年開始,人們都要更換新的日歷,你想知道未來一年的這么多天是怎么被確定下來的嗎?為什么去年的國慶節是星期五而今年的國慶節是星期三?那就來研究一下日歷算法吧。本文將介紹日歷的編排規則,確定某日是星期幾的計算方法,以及如何在計算機上打印某一年的年歷。

要研究日歷算法,首先要知道日歷的編排規則,也就是歷法。所謂歷法,指的就是推算年、月、日的時間長度和它們之間的關系,指定時間序列的法則。我國的官方歷法是中國公歷,也就是世界通用的格里歷(Gregorian Calendar),中國公歷的年分為平常年和閏年,平常年一年是365天,閏年一年是366天。判定一年是平常年還是閏年的規則如下:

1、  如果年份是4的倍數,且不是100的倍數,則是閏年;

2、  如果年份是400的倍數,則是閏年;

3、  不滿足1、2條件的就是平常年。

總結成一句話就是:四年一閏,百年不閏,四百年再閏。

中國公歷關于月的規則是這樣的,一年分為十二個月,其中一月、三月、五月、七月、八月、十月和十二月是大月,一個月有31天。四月、六月、九月和十一月是小月,一個月有30天。二月天數要根據是否是閏年來定,如果是閏年,二月是29天,如果是平常年,二月是28天。

除了年月日,人們日常生活中還對日期定義了另一個屬性,就是星期幾。星期并不是公歷范疇內的東西,但是人們已經習慣用星期來管理和規劃時間,比如一個星期工作五天,休息兩天等等,星期的規則徹底改變了人們的生活習慣,因此星期已經成為歷法中的一部分了。星期的命名最早起源于古巴比倫文化。公元前7-6世紀,巴比倫人就使用了星期制,一個星期中的每一天都有一個天神掌管。這一規則后來傳到古羅馬,并逐漸演變成現在的星期制度。

如何知道某一天到底是星期幾?除了查日歷之外,是否有辦法推算出來某一天是星期幾呢?答案是肯定的,星期不象年和月那樣有固定的歷法規則,但是星期的計算也有自己的規律。星期是固定的7天周期,其排列順序固定,不隨閏年、平常年以及大小月的天數變化影響。因此,只要確切地知道某一天是星期幾,就可以推算出其它日期是星期幾。推算的方法很簡單,就是計算兩個日期之間相差多少天,用相差的天數對7取余數,這個余數就是兩個日期的星期數的差值。舉個例子,假設已經知道1977年3月27日是星期日,如何得知1978年3月27日是星期幾?按照前面的方法,計算出1977年3月27日到1978年3月27日之間相差365天,365除以7余數是1,所以1978年3月27日就是星期一。

上述方法計算星期幾的關鍵是求出兩個日期之間相隔的天數。有兩種常用的方法計算兩個日期之間相隔的天數,一種是利用公歷的月和年的規則直接計算,另一種是利用儒略日計算。利用公歷規則直接計算兩個日期之間相差的天數,簡單地講就是將兩個日期之間相隔的天數分成三個部分:前一個日期所在年份還剩下的天數、兩個日期之間相隔的整數年所包含的天數和后一個日期所在的年過去的天數。如果兩個日期是相鄰兩個年份的日期,則第二部分整年的天數就是0。以1977年3月27日到2005年5月31日為例,1977年還剩下的天數是279天,中間整數年是從1978年到2005年(不包括2005年),共26年,包括7個閏年和20個平常年,總計9862天,最后是2005年從1月1日到5月31日經過的天數151天。三者總結10292天。直接利用公歷規則計算日期相差天數的算法實現如下(為了簡化算法復雜度,這個實現假設用于定位星期的那個日期總是在需要計算星期幾的那個日期之前):

int CalculateDays(int ys, int ms, int ds, int ye, int me, int de) { int days = CalcYearRestDays(ys, ms, ds); if(ys != ye) /*不是同一年的日期*/ { if((ye - ys) >= 2) /*間隔超過一年,要計算間隔的整年時間*/ { days += CalcYearsDays(ys + 1, ye); } days += CalcYearPassedDays(ye, me, de); } else { days = days - CalcYearRestDays(ye, me, de); } return days; }/*計算一年中過去的天數,包括指定的這一天*/ int CalcYearPassedDays(int year, int month, int day) { int passedDays = 0; int i; for(i = 0; i < month - 1; i++) { passedDays += daysOfMonth[i]; } passedDays += day; if((month > 2) && IsLeapYear(year)) passedDays++; return passedDays; }/*計算一年中還剩下的天數,不包括指定的這一天*/ int CalcYearRestDays(int year, int month, int day) { int leftDays = daysOfMonth[month - 1] - day; int i; for(i = month; i < MONTHES_FOR_YEAR; i++) { leftDays += daysOfMonth[i]; } if((month <= 2) && IsLeapYear(year)) leftDays++; return leftDays; } /* 計算years年1月1日和yeare年1月1日之間的天數, 包括years年1月1日,但是不包括yeare年1月1日 */ int CalcYearsDays(int years, int yeare) { int days = 0; int i; for(i = years; i < yeare; i++) { if(IsLeapYear(i)) days += DAYS_OF_LEAP_YEAR; else days += DAYS_OF_NORMAL_YEAR; } return days; }

另一種計算兩個日期相差天數的方法是利用儒略日(Julian Day,JD)進行計算。首先介紹一下儒略日,儒略日是一種不記年,不記月,只記日的歷法,是由法國學者Joseph Justus Scaliger(1540-1609)在1583年提出來的一種以天數為計量單位的流水日歷。儒略日和儒略歷(Julian Calendar)沒有任何關系,命名為儒略日也僅僅他本人為了紀念他的父親

主站蜘蛛池模板: 合肥市| 营山县| 临湘市| 平遥县| 噶尔县| 榕江县| 东丽区| 宜川县| 东阳市| 沙坪坝区| 宁波市| 金湖县| 修武县| 府谷县| 德昌县| 锡林郭勒盟| 衡阳县| 炎陵县| 郯城县| 库尔勒市| 博乐市| 广州市| 肥乡县| 哈密市| 怀化市| 枣强县| 资中县| 东乡族自治县| 思茅市| 五台县| 英德市| 宽甸| 仁寿县| 临湘市| 泾川县| 米脂县| 辰溪县| 香河县| 贵德县| 图们市| 疏勒县|