CCF-CSP 日期計算
問題描述
試題編號:201509-2 試題名稱:日期計算 時間限制:1.0s 記憶體限制:256.0MB 問題描述 給定一個年份y和一個整數d,問這一年的第d天是幾月幾日? 注意閏年的2月有29天。滿足下面條件之一的是閏年: 1) 年份是4的整數倍,而且不是100的整數倍; 2) 年份是400的整數倍。 輸入格式 輸入的第一行包含一個整數y,表示年份,年份在1900到2015之間(包含1900和2015)。 輸入的第二行包含一個整數d,d在1至365之間。 輸出格式 輸出兩行,每行一個整數,分別表示答案的月份和日期。 樣例輸入 2015 80 樣例輸出 3 21 樣例輸入 2000 40 樣例輸出 2 9
題解1
這個題目還是比較簡單的,首先可以構建一個數組,用於儲存每個月的天數,通過輸入的年份可以判斷出是閏年還是平年,然後根據判斷的結果修改天數列表中2月的天數,這樣就得到了這一年每個月的天數列表。然後,依次遍歷這個列表,用輸入的天數減去當前月份的天數,如果結果大於0,則說明第d天至少還在下個月,所以將月份加1,總天數減去當前月份的天數。直到總天數減去當前月份的天數小於0,說明第d天就在這個月,輸出月份和日期。
year = int(input())# 輸入的年份 day = int(input())# 輸入的天數 base = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]# 每個月的天數 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:# 判斷是閏年還是平年 base[1] = 29# 閏年的2月有29天 month = 1# 至少是1月 for i in base: if day - i > 0:# 計算月份與日期 month += 1# 月份加1 day = day - i# 天數減去當前月份的天數 else:# 輸出結果 print(month) print(day) break
題解2
使用內部的庫datetime
,將輸入年份的第一天轉換成 datetime,然後將天數轉換成 datetime 的時間增量,第 1 天加上時間增量即為 y 年的第 d 天,推算完成後輸出結果即可。
import datetime y = int(input())# 輸入的年份 day_of_year = int(input())# 輸入的天數 date0 = datetime.datetime(y, 1, 1)# 初始時間 delta = datetime.timedelta(days=day_of_year - 1)# 增量 date1 = date0 + delta# 日期推算 print(date1.month)# 輸出月份 print(date1.day)# 輸出日期
知識補充
datetime 庫
- date 類
date
物件表示理想化日曆中的日期(年,月和日),當前格里高利曆在兩個方向上無限延伸。 1年1月1日稱為第1天,1年1月2日稱為第2天,依此類推。date
類有三個引數,datetime.date(year,month,day)
,返回year-month-day
>>>import datetime >>>d = datetime.date(2018, 10, 28)# 將日期轉換為 date 物件 >>>datetime.date.weekday(d)# 返回日期的星期 6# 2018年10月28日是星期天,返回的值是從0開始的數 >>>datetime.date.isoformat(d)# 返回格式為 YYYY-MM-DD 的日期 '2018-10-28' >>>datetime.date.today()# 返回當前系統日期 datetime.date(2018, 10, 28)
- datetime 類
datetime
物件是包含日期物件和時間物件的所有信息的單個物件。與日期物件一樣,日期時間假定當前公曆在兩個方向上延伸;像時間物件一樣,日期時間假設每天都有3600 * 24秒。
>>>import datetime >>>datetime.datetime(2018, 1, 1)# 將時間轉換成 datetime 物件 datetime.datetime(2018, 1, 1, 0, 0) >>>datetime.datetime.now()# 返回當前系統時間 datetime.datetime(2018, 10, 27, 21, 55, 18, 292266) >>>datetime.datetime.now().strftime('%b-%d-%Y %H:%M:%S')# 由日期格式轉化為字串格式 'Oct-27-2018 21:57:16' >>>datetime.datetime.now().date()# 返回當前日期時間的日期部分 datetime.date(2018, 10, 27) >>>datetime.datetime.now().time()# 返回當前日期時間的時間部分 datetime.time(21, 58, 11, 927696) >>>datetime.datetime.today()# 返回當前系統時間 datetime.datetime(2018, 10, 27, 22, 1, 21, 935058)
- timedelta 類
timedelta
物件表示持續時間,兩個日期或時間之間的差異,用於計算兩個日期之間的差值。
>>>a = datetime.datetime.now() >>>b = datetime.datetime.now() >>>b-a# 計算差值 datetime.timedelta(seconds=4, microseconds=352740) >>>(b-a).seconds# 計算秒數差值 4 >>>(b-a).days# 計算天數差值 0