C/C++ 2020年第十一届蓝桥杯B组第一场---B题---纪念日

涨知识了,这篇文章违规了

本题总分:5 分
【问题描述】
2020 年 77 月 11 日是中国共 gong产chan 党dang 成立 99 周年纪念日。
中国共 gong产chan 党dang 成立于 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) + countPassedDays(eTime);
    cout << days * 24 * 60 << endl;
    return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值