AcWing 2867. 回文日期
原题链接
简单
作者:
Moccept
,
2024-04-08 20:37:05
,
所有人可见
,
阅读 1
#include <bits/stdc++.h>
using namespace std;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int date)
{
int year = date / 10000;
int month = date % 10000 / 100;
int day = date % 100;
if(!day||month<=0||month>12) return false;//月份日期为零不合法
if(month!=2 && day>months[month]) return false; //日期不合法
if(month==2)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
//判断平闰年
if (day > 29)
return false;
else
{
if (day > 28)
return false;
}
}
}
return true;
}
bool check1(string s)
{
int len = s.size();
for (int i = 0, j = len - 1; i < j; i++, j--)
{
if (s[i] != s[j])
return false;
}
return true;
}
bool check2(string s)
{
if (check1(s))
{
if (s[0] != s[2] || s[1] != s[3] || s[0] == s[1])
return false; //判断是否是ABABBABA
return true;
}
return false;
}
int main()
{
int date, flag = 0;
cin >> date;
for (int i = date + 1;; i++)
{
if (check(i))
{
string s = to_string(i); //判断完成后将年月日转换为字符串
if (check1(s) && !flag) // flag标记避免重复输出
{
cout << i << endl;
flag = 1;
}
if (check2(s))
{
cout << i << endl;
return 0;
}
}
}
return 0;
}