1 条题解
-
0
思路与算法
枚举四位年份,反转年份确定唯一月日后验证真实日期、闰年和闭区间;不是枚举整数回文或普通日期差。
按上述模型建立状态或枚举对象,依代码中的顺序处理输入并输出完整答案。
正确性说明
八位回文的后四位由年份前四位唯一决定,故每个可能年份仅有一个候选且无重复。合法月日、闰年和闭区间检查恰好筛出真实满足条件的日期。
复杂度
枚举固定9000年,O(9000)时间、O(1)额外空间,含月天数表初始化。
易错点
月份或日期可能由反转产生0;先检查月份再访问数组。世纪年须再检查400整除。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { int a, b; cin >> a >> b; int ans = 0; for (int y = 1000; y <= 9999; y++) { int t = y, v = y; for (int k = 0; k < 4; k++) { v = v * 10 + t % 10; t /= 10; } int m = v / 100 % 100, d = v % 100; int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; days[2] += y % 400 == 0 || (y % 4 == 0 && y % 100 != 0); if (v >= a && v <= b && m >= 1 && m <= 12 && d >= 1 && d <= days[m]) ans++; } cout << ans << "\n"; }
- 1