題目描述:
有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天
輸入:
有多組資料,每組資料有兩行,分別表示兩個日期,形式為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...