题解:洛谷 P5737 闰年展示
【题目来源】
【题目描述】
输入 \(x,y\),输出 \([x,y]\) 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。
【输入】
输入两个正整数 \(x,y\),以空格隔开。
【输出】
第一行输出一个正整数,表示 \([x,y]\) 区间中闰年个数。
第二行输出若干个正整数,按照年份单调递增的顺序输出所有闰年年份数字。
【输入样例】
1989 2001
【输出样例】
3
1992 1996 2000
【核心思想】
-
问题分析:给定一个年份区间 \([x, y]\),需要统计其中闰年的个数,并列出所有闰年年份。根据闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。本质是一个条件判断与遍历统计问题,只需遍历区间内的每一年并应用闰年判定规则。
-
算法选择:
- 遍历 + 条件判断:从 \(x\) 到 \(y\) 遍历每个年份,用闰年判定条件检查,若满足则计数并存储(或第二次遍历时输出)。
- 时间复杂度:\(O(y - x + 1)\),区间长度通常不大,完全可行。
-
关键步骤:
- 读入:读取 \(x\) 和 \(y\)。
- 第一遍遍历:统计闰年个数。
- 输出个数:先输出闰年总数。
- 第二遍遍历:再次遍历区间,输出所有闰年年份,用空格分隔。
-
时间/空间复杂度:
- 时间复杂度:\(O(y - x + 1)\),即区间长度。
- 空间复杂度:\(O(1)\),只使用常数变量。
-
闰年规则与模拟:
- 闰年判定条件:
(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
浙公网安备 33010602011771号