思路:
1:按年份枚举就可以,不用一天一天枚举(因为是按照前四个数字回文的)。
2:构造出回文判断是否满足年月日的形式,得到result1和result2
易错点:
1:构造出回文以后需要先判断是否满足年月日的形式!!!
2:字符串转整型 atoi(s.c_str())
不能用stoi(),它是c++11的标准
3:整型转字符串
while (tmp != 0){ //整型转换成字符串
s.insert(s.begin(), tmp % 10 + '0');
tmp /= 10;
}
4:是回文的前提下判断是否是ABABBABA的形式
if (s[0] == s[2] && s[1] == s[3]) return 1;
5:
for (int i = year; i <= 9999; ++i){ // <9000 错误
//因为题目给的样例范围是<=89991231 ,而不是遍历的范围,应该是<10000!!!
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int huiwen(string s);
int abab(string s);
int isleap(string s);
int isnot(string s);
int day[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
int main(){
int a;
cin >> a;
int year = a / 10000;
string result1, result2;
//根据年份枚举
for (int i = year; i <= 9999; ++i){ // <9000 错误 !!!
int tmp = i;
string s;
while (tmp != 0){ //整型转换成字符串
s.insert(s.begin(), tmp % 10 + '0');
tmp /= 10;
}
s += string(s.rbegin(), s.rend());
if (isnot(s)) continue;
if (atoi(s.c_str()) > a && huiwen(s)) { //字符串转换成整型
if (result1 == "") result1 = s;
if (abab(s)) {
result2 = s;
break;
}
}
}
cout << result1 << endl << result2 << endl;
return 0;
}
int huiwen(string s){
if (string(s.begin(), s.begin() + 4) == string(s.rbegin(), s.rbegin() + 4)) return 1;
return 0;
}
int abab(string s){
if (s[0] == s[2] && s[1] == s[3]) return 1;
return 0;
}
int isleap(string s){
int year = atoi(s.c_str());
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) return 1;
return 0;
}
int isnot(string s){ //需要判断日期格式 !!!
if (string(s.begin() + 4, s.begin() + 6) > "12" || string(s.begin() + 6, s.begin() + 8) > "31") return 1;
string month(s.begin() + 4, s.begin() + 6);
string ri(s.begin() + 6, s.begin() + 8);
if (atoi(ri.c_str()) > day[isleap(string(s.begin(), s.begin() + 4))][atoi(month.c_str())]) return 1;
return 0;
}