直接枚举回文串,再判断合法性就行
#include<iostream>
using namespace std;
int dayInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isLeapYear(int year){
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
bool check1(int num){
dayInMonth[2] = 28;
int day = num % 100;
num /= 100;
int mon = num % 100;
int year = num / 100;
if(isLeapYear(year)) dayInMonth[2] = 29;
if(mon < 1 || mon > 12) return false;
return day <= dayInMonth[mon];
}
bool check2(int num){
int a = num % 10;
num /= 10;
int b = num % 10;
num /= 10;
int flag = 0;
if(a == b) return false;
while(num){
if(flag == 1) {
swap(a, b);
}
if(a != num % 10) return false;
num /= 10;
if(b != num % 10) return false;
num /= 10;
flag++;
}
return true;
}
int main(){
int n;
bool first = false, second = false;
cin >> n;
for(int i = n / 10000; i <= 9999;i++){
if(first && second) break;
int temp = i;
int num = i;
while(temp){
int t = temp % 10;
num = num * 10 + t;
temp /= 10;
}
if(num <= n) continue;
if(check1(num)){
if(!first){
cout << num << endl;
first = true;
}
if(check2(num)) {
cout << num;
second = true;
}
}
}
// cout << check2(n);
return 0;
}