相关题目
https://www.acwing.com/problem/content/description/468/
466. 回文日期
样例
20200202
输出
20211202
21211212
算法1
根据题意,循环枚举每一个回文日期和ABABBABA型日期
// 枚举每一个回文日期
for(int i=begin;i<=8999;i++)
{
int date =i;
int temp =i;
for(int j=0;j<4;j++)
{
int t = temp%10;
date*=10;
date+=t;
temp/=10;
}
// 不在输入范围内的日期不符合题意
if(date<=n)continue;
if(check(date))
{
cout<<date<<endl;
break;
}
}
// 枚举每一个ABABBABA日期
for(int i=10;i<=89;i++)
{
int temp = i;
int date = i;
int a=temp/10%10;
int b=temp%10;
if(a==b) continue;
date*=10;
date+=a;
date*=10;
date+=b;
date*=10;
date+=b;
date*=10;
date+=a;
date*=10;
date+=b;
date*=10;
date+=a;
if(date<=n) continue;
if(check(date))
{
cout<<date<<endl;
break;
}
}
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int days[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int date)
{
int day = date%100;
int month =date/100%100;
int year =date/10000;
if(month<=0||month>12) return false;
if (day == 0 || month != 2 && day > days[month]) return false;
if (month == 2)
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if (day > 28 + leap) return false;
}
return true;
}
int main()
{
cin>>n;
int begin= n/10000;
// 枚举每一个回文日期
for(int i=begin;i<=8999;i++)
{
int date =i;
int temp =i;
for(int j=0;j<4;j++)
{
int t = temp%10;
date*=10;
date+=t;
temp/=10;
}
if(date<=n)continue;
if(check(date))
{
cout<<date<<endl;
break;
}
}
// 枚举每一个ABABBABA日期
for(int i=10;i<=89;i++)
{
int temp = i;
int date = i;
int a=temp/10%10;
int b=temp%10;
if(a==b) continue;
date*=10;
date+=a;
date*=10;
date+=b;
date*=10;
date+=b;
date*=10;
date+=a;
date*=10;
date+=b;
date*=10;
date+=a;
if(date<=n) continue;
if(check(date))
{
cout<<date<<endl;
break;
}
}
return 0;
}