解题思路
- 采用暴力和枚举的方法进行处理,先判断是否满足回文,如果满足再判断是否是ABAB类型,如果是则找到了结果.
- 处理时,第一次需要从输入日期的后一天开始进行判断
代码
#include<iostream> #include<string> using namespace std; string s; int year, month, day; int month1, day1; int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; bool flag1 = false, flag = true;//flag :判断是否是第一次循环 flag1: 判断是否找到回文 bool solve1(string s)//判断回文的方法 { for (int i = 0; i <= s.size() / 2; i++) { if (s[i] != s[s.size() - i - 1]) { return false; } } return true; } bool solve2(string s) {//判断是否是ABAB类型的 if (s[0] == s[2] && s[1] == s[3]) { return true; } return false; } void solve(string s)// 处理问题的方法 { year = stoll(s.substr(0, 4)); month = stoll(s.substr(4, 2)); day = stoll(s.substr(6, 2)); // for (int i = year; i; i++)//年 { if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) { months[2] = 29; } else { months[2] = 28; } if (flag) { month1 = month; day1 = day + 1; flag = false; }else { month1 = 1; day1 = 1; } for (int j = month1; j <= 12; j++)//月 { for (int k = day1; k <= months[j]; k++) { s = to_string(i); if (j < 10) { s += "0" + to_string(j); } else { s += to_string(j); } if (k < 10) { s += "0" + to_string(k); } else { s += to_string(k); } //cout << s << endl; if (solve1(s))//判断是否是回文 { //cout << s << endl; if (!flag1)//如果还没找到,则这个就是最近的那个 { cout << s << endl; flag1 = true; } if (solve2(s)) {//判断是否是ABAB类型的回文日期 cout << s << endl; return; } } } } } } int main() { cin >> s; solve(s); return 0; }
总结
C++11 中提供了许多方便的函数,比如 整形转换成字符串 to_string(),字符串转换成整形 stoll().这些使用起来还是很方便的.另外字符串只能和字符串用 + 做拼接,如果两边一边一个整数一边一个字符串类型则会出错.