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;
}    
相关推荐
水水沝淼㵘几秒前
嵌入式开发学习日志(数据结构--双链表)Day21
c语言·数据结构·学习·算法·排序算法
qqxhb8 分钟前
零基础学Java——第十一章:实战项目 - 微服务入门
java·开发语言·spring cloud·微服务
CodeCraft Studio25 分钟前
国产化Word处理控件Spire.Doc教程:通过C# 删除 Word 文档中的超链接
开发语言·c#·word
martian66538 分钟前
麒麟系统下Tomcat部署Java Web程序(WAR包)及全链路问题排查指南
开发语言·tomcat·系统安全
ai.Neo38 分钟前
牛客网NC22012:判断闰年问题详解
开发语言·c++·算法
好吃的肘子1 小时前
ElasticSearch进阶
大数据·开发语言·分布式·算法·elasticsearch·kafka·jenkins
NaclarbCSDN1 小时前
Java集合框架
java·开发语言·前端
xiaohanbao091 小时前
day26 Python 自定义函数
开发语言·python·学习·机器学习·信息可视化·numpy
jie188945758661 小时前
c++,windows,多线程编程详细介绍
开发语言·c++
破晓的历程1 小时前
Qt file文件操作详解
开发语言·qt