当前位置:首页C++ > 正文

宜宾野牛程序员教少儿编程之GESP等级考试相关知识点:计算 N 小时后的日期时间(如何处理闰年、平年、大月、小月及2月)

作者:野牛程序员:2025-03-25 08:20:28C++阅读 1997
宜宾野牛程序员教少儿编程之GESP等级考试相关知识点:计算 N 小时后的日期时间(如何处理闰年、平年、大月、小月及2月)

题目:计算 N 小时后的日期时间

题目描述
输入一个年份、月份、日期、小时以及一个整数N,表示经过 N 小时后,计算对应的年、月、日、小时

输入格式

  • 一个四个整数:year month day hour(分别表示当前的年份、月份、日期、小时)。

  • 一个整数:N(表示经过的小时数,N ≥ 0)。

输出格式

  • 计算经过 N 小时后的年、月、日、小时,格式为 YYYY-MM-DD HH


野牛程序员知识点讲解:


年、月、日与闰年平年

在日常生活中,时间是按照年、月、日进行计算的。其中,一年指地球围绕太阳公转一周的时间,大约为365.2422天。为了方便计算,采用公历(即阳历)来安排每年的天数,并制定了闰年和平年的规则。


闰年与平年

为了让历法更加准确,人们规定:

  • 平年:一年有365天

  • 闰年:一年有366天,比平年多一天(2月29日)。

判断闰年的规则

符合以下任一条件的年份是闰年

  1. 能被4整除,但不能被100整除(如:2024年、2028年)。

  2. 能被400整除(如:2000年、2400年)。

其他情况均为平年(如:2023年、2100年)。


月份分类

一年共有12个月,不同月份的天数不同:

  • 大月(31天):1月、3月、5月、7月、8月、10月、12月。

  • 小月(30天):4月、6月、9月、11月。

  • 特殊的2月

    • 平年:28天。

    • 闰年:29天。


2月的特殊性

2月之所以有28天或29天,是因为历法调整的需要。古罗马最初的历法一年只有10个月,后来增加了1月和2月,其中2月被设定为最短的月份,并作为调整年份天数的依据,因此遇到闰年时会增加一天,变为29天。


总结

  • 一年有12个月,分为大月、小月和特殊的2月。

  • 闰年比平年多一天,2月有29天。

  • 闰年规则:能被4整除但不能被100整除,或能被400整除。

  • 了解这些规则,有助于准确计算日期,合理安排时间。


#include <iostream>
#include <iomanip>

using namespace std;

// 判断是否是闰年
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 获取某个月的天数
int getDaysInMonth(int year, int month) {
    // 大月:31天
    if (month == 1 || month == 3 || month == 5 || month == 7 ||
        month == 8 || month == 10 || month == 12) {
        return 31;
    }
    // 小月:30天
    else if (month == 4 || month == 6 || month == 9 || month == 11) {
        return 30;
    }
    // 2月特殊处理
    else if (month == 2) {
        return isLeapYear(year) ? 29 : 28;
    }
    return 0; // 非法月份
}

// 计算 N 小时后的时间
void calculateFutureTime(int year, int month, int day, int hour, int N) {
    hour += N; // 直接加上小时数

    // 处理溢出的小时
    while (hour >= 24) {
        hour -= 24;
        day++;

        // 处理溢出的日期
        if (day > getDaysInMonth(year, month)) {
            day = 1;
            month++;

            // 处理溢出的月份
            if (month > 12) {
                month = 1;
                year++;
            }
        }
    }

    // 输出最终结果
    cout << setw(4) << setfill('0') << year << "-"
         << setw(2) << setfill('0') << month << "-"
         << setw(2) << setfill('0') << day << " "
         << setw(2) << setfill('0') << hour << endl;
}

int main() {
    int year, month, day, hour, N;

    // 输入数据
    cout << "请输入年月日小时(格式:YYYY MM DD HH):" << endl;
    cin >> year >> month >> day >> hour;

    cout << "请输入经过的小时数 N:" << endl;
    cin >> N;

    // 计算并输出结果
    calculateFutureTime(year, month, day, hour, N);

    return 0;
}

示例输入输出

示例 1

输入

2025 3 24 22
5

输出

2025-03-25 03

(2025 年 3 月 24 日 22 时后 5 小时是 2025 年 3 月 25 日 03 时)

示例 2(闰年计算)

输入

2024 2 28 23
26

输出

2024-03-01 01

(2024 是闰年,2 月有 29 天,经过 26 小时后进入 3 月)

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 宜宾野牛程序员教少儿编程之GESP等级考试相关知识点:计算 N 小时后的日期时间(如何处理闰年、平年、大月、小月及2月)
  • 相关推荐

    最新推荐

    热门点击