1. 程式人生 > 其它 >C/C++ 2020年第十一屆藍橋杯B組第一場---B題---紀念日

C/C++ 2020年第十一屆藍橋杯B組第一場---B題---紀念日

技術標籤:C/C++程式藍橋

本題總分: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;
}