王道機考系列 日期類問題

2021-09-05 11:29:18 字數 2977 閱讀 8763

有兩個日期,計算兩個日期之間的天數,如果兩個日期是連續的,我們規定他們之間的天數為兩天。

輸入: 有多組輸入,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd;

輸出: 每組資料輸出一行,即日期差值。

樣例輸入:

20110412

20110422

樣例輸出:

11

解析:將原問題統一到乙個確定的起點區間上去,比如0年1月1日,當我們輸入日期的時候計算出日期與起點區間的差,當我們計算兩個日期的差時只需要將它們與起點區間的差相減就ok了,這個做法可以先計算出每個日期與起點日期之間的差,當我們輸入日期的時候在o(1)的時間內可以查出當前日期與起點日期的差,相當於是用空間換取時間的做法。

注意:

閏年的判斷條件是:當年數如果不能被100整除但是能被4整除時為閏年或者當年數能被40整除時為閏年

實現的c++程式

#include

#include

#define isleapyear(x) (x % 100 != 0 && x % 4 == 0) || x % 400 == 0 ? 1 : 0

// 使用巨集定義來判斷一年是不是閏年

int dayofmonth[13]

[2]=

;struct date }}

};int buf[

5001][

13][32

];//儲存預處理的天數

intabs

(int x)

intmain()

int y1, m1, d1;

int y2, m2, d2;

while

(scanf

("%4d%2d%2d"

,&y1,

&m1,

&d1)

!=eof

)return0;

}

以上**簡析:

(1)將資料本身與資料的儲存位址聯絡起來,儲存日期的時候使用三維陣列,這樣訪問方便;(2)程式輸入採取了技巧,因為題目規定使用連續的8位資料,所以使用%4d來讀取前四位並賦值給year,後面的%2d%2d也是同樣的思路;(3)在main函式體外定義預處理陣列buf[5001][13][32],避免函式在執行的時候棧的空間不夠而出現棧溢位的情況。

給出乙個日期,求出這個時期是星期幾。

輸入樣例: 輸出樣例:

9 october 2001 tuesday

14 october 2001 sunday

解析:這個問題也同樣可以使用預處理的思路來解決,首先需要知道今天星期幾,給定日期與今天相比差幾天,利用這個數字對7求模,即可得出給定日期星期幾。

(1)c++實現程式如下所示:

#include

#include

#include

using

namespace std;

#define isleapyear(x) (x % 100 != 0 && x % 4 == 0) || x % 400 == 0 ? 1 : 0

char dayofmonth[13]

[2]=

;struct date}}

};char monthname[13]

[20]=

;char weekname[7]

[20]=

;int buff[

5001][

13][32

];intmain()

int year;

char month[20]

;int day;

while

(scanf

("%d%s%d"

,&day, month,

&year)

!=eof

)return0;

}

(2)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月來計算,比如2023年1月1日要看作2023年的13月1日來計算);d:日;[ ]代表取整,即只要整數部分。(c是世紀數減一,y是年份後兩位,m是月份,d是日數。1月和2月要按上一年的13月和 14月來算,這時c和y均按上一年取值。)算出來的w除以7,餘數是幾就是星期幾。如果餘數是0,則為星期日。

以2023年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)即2023年10月1日(100周年國慶)是星期5。

c++++實現如下所示:

#include

#include

#include

using

namespace std;

char monthname[13]

[20]=

;char weekname[7]

[20]=

;int

main()

return0;

}

pyspark系列 日期函式

日期函式 from pyspark.sql.functions import current date spark.range 3 withcolumn date current date show id date 0 2018 03 23 1 2018 03 23 from pyspark.sql...

王道機考系列 資料結構

例1.括號匹配 例2.計算簡單表示式 哈夫曼樹的定義 在含有n個帶權葉子結點的二叉樹中,其中帶權路徑長度 wpl 最小的二叉樹稱為哈夫曼樹,也成為最優二叉樹。構造哈夫曼樹的演算法描述如下 給定n個權值分別為w1,w2,wn的節點。1 將這n個結點分別作為n棵樹僅含乙個結點的二叉樹,構成森林f.2 構...

王道機試 日期類問題

題目描述 有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天輸入 有多組資料,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd輸出 每組資料輸出一行,即日期差值做題思路 樣例輸入 20110412 20110422樣例輸出 11對於日期類 年月日,就像學生資訊...