AcWing 2867. 回文日期
原题链接
简单
作者:
隐灵
,
2024-03-30 09:30:36
,
所有人可见
,
阅读 3
#include <iostream>
using namespace std;
int n;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool st = false;
bool check(int date) //判断日期是否真实存在
{
int year = date / 10000; //表示年
int month = date % 10000 / 100; //表示月
int day = date % 100; //表示日
if (month < 0 || month > 12) return false; //不在月份范围
if (month != 2 && day == 0 || day > days[month]) return false; //除二月外,不在月份天数范围
if (month == 2) //判断二月是否满足情况
{
int leap = year % 400 == 0 || year % 4 == 0 && year % 100;
if (day == 0 || day > 28 + leap) return false;
}
return true;
}
bool sym(int date) //判断是不是ABABBABA型
{
char str[20];
sprintf(str, "%d", date);
if (str[0] == str[2] && str[1] == str[3] && str[0] != str[1]) //判断是不是ABABBABA型,并且满足A≠B
return true;
return false;
}
int main()
{
scanf("%d", &n);
int t = n / 10000;
for (int i = t; i; i ++ ) //枚举月份
{
int date = i, x = i;
for (int i = 0; i < 4; i ++ ) //将年份对折,表示成回问日期
{
date = date * 10 + x % 10;
x /= 10;
}
if (!st) //只输出一次第一个回文日期
{
if (check(date)) //判断是不是正常日期
{
if (date <= n) continue; //如果日期小于等于给出的日期,则不满足题意,跳出循环
printf("%d\n", date);
st = true;
}
}
if (st) //如果输出回文日期,再输出ABABBABA型
{
if (check(date) && sym(date)) //判断是不是正常日期和ABABBABA型日期
{
printf("%d\n", date); //如果是,输出一次,然后程序结束
return 0;
}
}
}
return 0;
}