题解:洛谷 P5737 闰年展示

【题目来源】

洛谷:P5737 【深基7.例3】闰年展示 - 洛谷

【题目描述】

输入 \(x,y\),输出 \([x,y]\) 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。

【输入】

输入两个正整数 \(x,y\),以空格隔开。

【输出】

第一行输出一个正整数,表示 \([x,y]\) 区间中闰年个数。

第二行输出若干个正整数,按照年份单调递增的顺序输出所有闰年年份数字。

【输入样例】

1989 2001

【输出样例】

3
1992 1996 2000

【核心思想】

  1. 问题分析:给定一个年份区间 \([x, y]\),需要统计其中闰年的个数,并列出所有闰年年份。根据闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。本质是一个条件判断与遍历统计问题,只需遍历区间内的每一年并应用闰年判定规则。

  2. 算法选择

    • 遍历 + 条件判断:从 \(x\)\(y\) 遍历每个年份,用闰年判定条件检查,若满足则计数并存储(或第二次遍历时输出)。
    • 时间复杂度\(O(y - x + 1)\),区间长度通常不大,完全可行。
  3. 关键步骤

    • 读入:读取 \(x\)\(y\)
    • 第一遍遍历:统计闰年个数。
    • 输出个数:先输出闰年总数。
    • 第二遍遍历:再次遍历区间,输出所有闰年年份,用空格分隔。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(y - x + 1)\),即区间长度。
    • 空间复杂度:\(O(1)\),只使用常数变量。
  5. 闰年规则与模拟

    • 闰年判定条件(year % 4 == 0 && year % 100 != 0) || year % 400 == 0
    • 两次遍历:为了先输出个数再输出年份,需要两次遍历区间(或先存储闰年列表)。由于区间长度通常不大,两次遍历效率依然很高。
    • 适用场景:这类“区间内满足条件的元素统计与展示”是编程入门的经典题型,练习循环和条件判断。

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 判断闰年函数
 * @param n 待判断的年份
 * @return 如果是闰年返回true,否则返回false
 */
bool fun(int n)
{
    // 闰年判断条件:
    // 1. 能被4整除但不能被100整除
    // 2. 或者能被400整除
    if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
    {
        return true;
    }
    return false;
}

int main()
{
    int x, y;           // 定义变量:起始年份x和结束年份y
    int sum = 0;        // 定义变量:闰年总数

    cin >> x >> y;       // 输入年份范围

    // 统计给定范围内的闰年数量
    for (int i = x; i <= y; i++)
    {
        if (fun(i))      // 如果是闰年
        {
            sum++;       // 闰年计数加1
        }
    }

    // 输出闰年总数
    cout << sum << endl;

    // 输出所有闰年,用空格分隔
    for (int i = x; i <= y; i++)
    {
        if (fun(i))      // 如果是闰年
        {
            cout << i << " ";  // 输出该年份
        }
    }

    return 0;            // 程序正常结束
}

【运行结果】

1989 2001
3
1992 1996 2000
posted @ 2026-09-01 09:25  团爸讲算法  阅读(16)  评论(0)    收藏  举报