C/C++ 2020年第十一屆藍橋杯B組第一場---B題---紀念日
阿新 • • 發佈:2021-01-15
本題總分:5 分
【問題描述】
2020 年77月11日是中國 共 產 黨 成立99 週年紀念日。
中國 共 產 黨 成立於1921 年7月23 日。
請問從1921年7月23 日中午12 時到2020年7 月1 日中午12 時一共包含多少分鐘?
分析:
可以直接用計算機的計算器解決;但是非參賽時間,應該多些程式,鍛鍊思維
起初是打算用時間戳解決的,因為這是很現成的介面,只需要轉換就能得到結果,然後卻發現,時間戳無法解決1970年之前的時間,這也算是漲知識了吧
解決問題思路:因為中午12時至中午12時,所以計算天數即可;把時間段分成三部分,第一個部分:兩個日期之間的完整年份天數,第二部分:起始日期距年末的天數,第三部分:結束日期已度過的天數;
三個部分相加所得天數,即是兩個日期之間相差的天數, * 24 * 60 即可得到分鐘
結果:
附程式碼及詳細解析
#include <iostream> #include <vector> using namespace std; // 年月日結構體 struct mTime { uint32_t year; uint32_t month; uint32_t day; mTime() {} }; // 判斷輸入年份是否是閏年, true : 閏年 bool isLeapYear(const uint32_t &year) { if(year % 400 == 0 && year) { return true; } if(year % 4 == 0 && year % 100 != 0) { return true; } return false; } // 求取兩個日期之間完整年份的天數 uint32_t countYearDays(const mTime &sTime, const mTime &eTime) { uint32_t days = 0; // 從下一年開始計算完整年份 // 末尾年份前一年算完整年份 for(uint32_t i = sTime.year + 1; i < eTime.year; i++) { // 一年365天 days += 365; // 閏年 +1 天 if(isLeapYear(i)) { days += 1; } } return days; } // 計算輸入日期是一年中第幾天, 即已經度過的天數 uint32_t countPassedDays(const mTime &tTime) { // 每個月的天數 vector<int> monthDay{31,28,31,30,31,30,31,31,30,31,30,31}; uint32_t days = 0; // 計算已經度過月份的天數,不算最後一個月,因為沒過完 for(uint32_t i = 1; i < tTime.month; i++) { days += monthDay.at(i - 1); } // 如果輸入年份是潤年,且2月過完, +1天 if(isLeapYear(tTime.year) && tTime.month > 2) { days += 1; } // 計算最後一個月天數 days += tTime.day; return days; } // 計算輸入日期,離過完一年還差幾天 uint32_t countRestDays(const mTime &tTime) { uint32_t days = 365 - countPassedDays(tTime); // 輸入日期是閏年 +1 天 if(isLeapYear(tTime.year)) { days += 1; } return days; } int main() { mTime sTime; cout << "start:" << endl; cin >> sTime.year >> sTime.month >> sTime.day; mTime eTime; cout << "end:" << endl; cin >> eTime.year >> eTime.month >> eTime.day; // 中間年份天數 + 起始年份剩餘天數 + 末尾年份已度過天數 uint32_t days = countYearDays(sTime, eTime) + countRestDays(sTime) + countRestDays(eTime); cout << days * 24 * 60 << endl; return 0; }