C++入门练习之 给出年分m和一年中的第n天,算出第n天是几月几号

题目来自牛客

思路:首先得先读取输入的多组数据 然后首先要判断的是年份问题 因为年份要分闰年和平年每年天数会有些许差异

定义与设立目的

  • 闰年:是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。地球绕太阳公转一周的实际时间约为 365.2422 天 ,而平年按 365 天计算,每年会少约 0.2422 天,日积月累差距会增大,所以每四年增加一天,这一年就是闰年,让历法时间更接近天文时间。
  • 平年:指阳历没有闰日或者农历没有闰月的年份,是历法中的常规年份,用于标记时间流逝。

天数差异

  • 闰年:一年有 366 天 。其中 2 月有 29 天,比平年 2 月多 1 天;其他月份天数与平年相同,即 1、3、5、7、8、10、12 月有 31 天,4、6、9、11 月有 30 天。
  • 平年:一年有 365 天 。2 月有 28 天;1、3、5、7、8、10、12 月为 31 天,4、6、9、11 月为 30 天。

计算方式(判断方法)

  • 闰年
    • 非整百年份:能被 4 整除的年份就是闰年。例如 2024 年,2024÷4 = 506,没有余数,所以 2024 年是闰年 。
    • 整百年份:必须能被 400 整除才是闰年 。比如 2000 年,2000÷400 = 5,没有余数,2000 年是闰年;而 1900 年,1900÷400 = 4......300,有余数,所以 1900 年是平年。
  • 平年:一般年份数不能被 4 整除,或者整百年份数不能被 400 整除的年份就是平年。例如 2023 年,2023÷4 = 505......3,有余数,所以 2023 年是平年 。
cpp 复制代码
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    // 定义变量 y 用于存储输入的年份,n 用于存储该年中的第 n 天
    int y, n;
    // 循环读取输入,直到输入结束(例如遇到文件结束符)
    while (cin >> y >> n) {
        // 定义数组 daysPerMonth 来存储每个月的天数,初始时按照平年设置
        // 索引 0 对应 1 月,索引 1 对应 2 月,以此类推
        int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        // 判断输入的年份是否为闰年
        // 闰年的判断规则:能被 4 整除但不能被 100 整除,或者能被 400 整除
        if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
            // 如果是闰年,将 2 月的天数从 28 天修改为 29 天
            daysPerMonth[1] = 29;
        }

        // 定义变量 sumDays 用于累加从 1 月开始到当前月份的总天数
        int sumDays = 0;
        // 定义变量 month 用于存储最终计算出的月份,初始设为 1 月
        int month = 1;

        // 遍历每个月
        for (int i = 0; i < 12; ++i) {
            // 累加当前月份的天数到 sumDays 中
            sumDays += daysPerMonth[i];

            // 检查累加的总天数是否已经超过或等于输入的第 n 天
            if (sumDays >= n) {
                // 如果超过或等于,说明找到了对应的月份,将月份赋值给 month
                // 注意数组索引从 0 开始,所以要加 1 得到实际的月份
                month = i + 1;
                // 计算该月的具体日期
                // 用输入的第 n 天减去当前月份之前所有月份的总天数
                int day = n - (sumDays - daysPerMonth[i]);

                // 格式化输出结果,按照 yyyy-mm-dd 的格式
                // setw(4) 和 setfill('0') 确保年份输出为 4 位,不足 4 位时前面补 0
                // 同理,月份和日期输出为 2 位,不足 2 位时前面补 0
                cout << setw(4) << setfill('0') << y << "-"
                     << setw(2) << setfill('0') << month << "-"
                     << setw(2) << setfill('0') << day << endl;
                // 找到结果后,跳出循环,不再继续遍历后续月份
                break;
            }
        }
    }
    return 0;
}    

在这基础之上也可以实现

cpp 复制代码
#include <iostream>
#include <iomanip>

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

int main() {
    int m;
    std::cin >> m;
    while (m--) {
        int year, month, day, addDays;
        std::cin >> year >> month >> day >> addDays;

        // 每个月的天数,初始按照平年设置
        int daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (isLeapYear(year)) {
            daysPerMonth[1] = 29; // 闰年 2 月有 29 天
        }

        // 加上增加的天数
        day += addDays;
        while (day > daysPerMonth[month - 1]) {
            day -= daysPerMonth[month - 1];
            month++;
            if (month > 12) {
                year++;
                month = 1;
                if (isLeapYear(year)) {
                    daysPerMonth[1] = 29;
                } else {
                    daysPerMonth[1] = 28;
                }
            }
        }

        // 格式化输出结果
        std::cout << std::setw(4) << std::setfill('0') << year << "-"
                  << std::setw(2) << std::setfill('0') << month << "-"
                  << std::setw(2) << std::setfill('0') << day << std::endl;
    }

    return 0;
}    
相关推荐
算AI14 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55515 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄15 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
懒羊羊大王&15 小时前
模版进阶(沉淀中)
c++
无名之逆15 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔15 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙15 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
owde16 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
xixixin_16 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++