王道機試 日期類問題

2021-10-18 22:48:15 字數 2832 閱讀 9465

題目描述:

有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天
輸入:

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

每組資料輸出一行,即日期差值
做題思路:

樣例輸入:

20110412

20110422

樣例輸出:

11
對於日期類:年月日,就像學生資訊一樣,用結構體處理。

struct date
這裡提出乙個新的概念:預處理

首先無論輸入的兩行數字是什麼,我們不妨都初始化乙個日期init_date:如2023年1月1日,分別計算輸入的兩個日期離init_date的日期差值,然後再將這兩個差值相減,即得到結果。舉個栗子。小a就是初始化init_people,他的年齡是0歲0月,小b的年齡是7歲10個月,小c的年齡是15歲2個月,問小b與小c的月份之差。顯然,計算直接計算其實有點點的繞(畢竟不是十進位制,像我這種直白的人類處理起來就是容易搞錯),如果先計算小b與小a的月份差:7∗12

+10−0

=94(m

onth

)7*12+10-0 = 94(month)

7∗12+1

0−0=

94(m

onth

) 小c與小a的月份差:15∗12

+2−0

=182(m

onth

)15*12+2-0=182(month)

15∗12+

2−0=

182(

mont

h)所以小b與小c月份差:∣94−

182∣=88

(mon

th

)|94-182|=88(month)

∣94−18

2∣=8

8(mo

nth)

上面就是解決本題的乙個大體思路,但顯然本題還有很多的細節和難點:

閏年每個月份的天數

首先對於閏年的判斷,是每個人學習c語言入門必備的乙個知識點:閏年是4的倍數但不能是100的倍數,或者是400的倍數。就是公元100年不是閏年,但公元4年,400年是閏年。

bool isleap

(int year)

其次,判斷完閏年,我們可以開始處理每個月份的天數了,眾所周知,只有2月搖擺不定,所以我們不妨建立乙個二維陣列:int daysofmonth[13][2]

int daysofmonth[13]

[2]=

,,,//閏年是29天~,,

,,,,

,,,}

現在就可以開始進行預處理部分了:

假設此時我們簡化問題:計算某一天的明天的日期。這裡要考慮到天數是否超過了30(31,28,29),月數是否超過12?

void

nextday()

]//月份加1];

//day = 1;

month++;}

if(month>12)

接下來我們定義乙個三維陣列:int date[year][month][days]

具體來說,先設定乙個範圍(輸入的年份在0~2023年)則可定義為:int date[5001][13][32](不用下標零)

所謂預處理就是先填充這個陣列,如某個陣列單元date[y0][m0][d0]填充的內容就是y0年m0月d0日離初始2023年1月1日的gapdays.

gapdays =0;

//天數計時器

date tmp;

tmp.year=0;

tmp.month = tmp.day =1;

while

(tmp.year!=

5001

)//日期不超過2023年

有了上述預處理的過程,我們就可以根據輸入的時間從三維陣列裡直接找到(記起了學資料結構的時候,老師一直強調的陣列具有隨機訪問的特性。)其對應的gapdays,然後兩個相減就可以了。

結合上述分析,就可以寫程式了。

//2_3日期差值 

//針對此類問題,我們要量化每個月的天數

#include

bool isleap

(int d)

intabs

(int a)

int daysofmonth[13]

[2]=

;struct date}}

};int date[

5001][

13][32

];intmain()

int y1,y2,

m1,m2,

d1,d2;

while

(scanf

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

,&y1,

&m1,

&d1)

!=eof

)return0;

}

王道機試 搜尋

case1 百雞問題,三重迴圈的,在判斷 3時,因為是取整是去尾的,我用了 z 2 3,這樣就不會因為去尾造成問題了 includeusing namespace std int main return 0 其實可以優化為二重迴圈 王道上 迴圈變數x和y的範圍分別是100和100 x,這樣z就一定是...

日期類問題 機試自學手記(2)

文章根據王道機試書進行學習。當年數不能被100整除時若其能被4整除則為閏年,或者其能被400整除也為閏年,閏年二月29天,平年二月28天 即year 100 0 year 4 0 year 400 0 問題描述 有兩個日期,求兩個日期之間的天數,如果兩個日期時連續的我們規定他們之間的天數為兩天。輸入...

機試之日期問題 列印日期

題目描述 給出年分m和一年中的第n天,算出第n天是幾月幾號。輸入描述 輸入包括兩個整數y 1 y 3000 n 1 n 366 輸出描述 可能有多組測試資料,對於每組資料,按 yyyy mm dd的格式將輸入中對應的日期列印出來。示例1輸入 2000 32000 312000 402000 6020...