回文日期求解
作者:
巷港
,
2022-02-13 23:54:09
,
所有人可见
,
阅读 173
回文日期问题
2867.回文日期
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check_valid(int n) //判断日期是否合法
{
int year=n/10000;
int month=n%10000/100;
int day=n%100;
if (month<=0||month>12) return false;
if (day==0) return false;
if (month!=2)
{
if (day>months[month]) return false;
}
else
{
int leap=(year%4==0&&year%100!=0||year%400==0);
if (day>28+leap) return false;
}
return true;
}
bool check_ABAB(int n) //判断是否是ABABBABA型的回文数
{
int year=n/10000;
int month=n%10000/100;
int day=n%100;
if (month/10==day/10&&month%10==day%10&&month/10!=month%10) return true;
return false;
}
int main()
{
int date;
scanf("%d",&date);
int flag1=0,flag2=0; //flag1表示回文数是否已经找到,flag2表示ABABBABA型回文数是否已经找到
for (int i=1000;;i++) //回文数前4位和后四位是左右对称的,所以只需要枚举前4位情况进行构造回文数即可
{
int new_date=i,t=i;
for (int j=0;j<4;j++) //构造回文数
new_date=new_date*10+t%10,t/=10;
if (check_valid(new_date)&&new_date>date&&!flag1)
{
printf("%d\n",new_date);
flag1=1;
}
if (check_valid(new_date)&&check_ABAB(new_date)&&new_date>date&&!flag2)
{
printf("%d\n",new_date);
flag2=1;
return 0;
}
}
return 0;
}