涨知识了,这篇文章违规了
本题总分: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;
}