链接
知识点
模拟,暴力,枚举
思路
1、将输入的整数以字符串形式输入,在分别转为int类型的year、month、day。
2、枚举年月日,把不合法的日期以及不符和题目要求的日期去掉,再将年月日分别转为指定位数的字符串,之后再将年月日对应的字符串拼接起来,形成题目要求的日期字符串,再判断日期字符串是否为回文字符串和ABABBABA 型字符串。
代码
#include<bits/stdc++.h>
using namespace std;
//将字符串转为int类型
int s2i(string s){
int res=0;
for(auto i : s){
res = res*10 + i - '0';
}
return res;
}
//将int类型转为指定位数的字符串
string i2s(int a,int n){
string s;
while(a){
int m = a % 10;
s += m + '0';
a /= 10;
}
while(s.size() < n){
s += '0';
}
reverse(s.begin(),s.end());
return s;
}
//判断是否为闰年
bool isLeapYear(int year){
if((year % 4 == 0 && year % 100 != 0) && (year %400 == 0)){
return true;
}
return false;
}
//判断日期是否合法
bool isDay(int year,int month,int day){
int nums[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year)){
nums[2] = 29;
}
if(day > nums[month]){
return false;
}
return true;
}
//判断是否为回文字符串
bool isPalindrome(string s){
for(int i=0; i <= s.size()/2; i++){
if(s[i]!=s[s.size() - i - 1]){
return false;
}
}
return true;
}
//判断是否为ABABBABA型字符串
bool isAB(string s){
if(!isPalindrome(s)){
return false;
}
if(s[0]==s[2] && s[1]==s[3]){
return true;
}
return false;
}
int main(){
string s;
cin>>s;
int year = s2i(s.substr(0,4));
int month = s2i(s.substr(4,2));
int day = s2i(s.substr(6,2));
bool ans1 = false,ans2 = false;
for(int i = year;i <= 9999 ;i++){
for(int j = 1;j <= 12; j++){
for(int k=1; k <= 31;k++){
if(i == year && j == month && k <= day){
continue;
}
if(!isDay(i,j,k)){
continue;
}
string date = i2s(i,4) + i2s(j,2) + i2s(k,2);
if(!ans1 && isPalindrome(date)){
cout<<date<<endl;
ans1 = true;
}
if(!ans2 && isAB(date)){
cout<<date<<endl;
ans2 = true;
}
}
}
}
return 0;
}