蓝桥杯2020--回文日期
解题思路
- 采用暴力和枚举的方法进行处理,先判断是否满足回文,如果满足再判断是否是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().这些使用起来还是很方便的.另外字符串只能和字符串用 + 做拼接,如果两边一边一个整数一边一个字符串类型则会出错.