蓝桥杯--回文日期

题目描述
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入
20200202
输出
20211202
21211212
思路: 暴力枚举:将输入数据后面的日期一一枚举出来,并判断是否回文和ABAB类型
【蓝桥杯--回文日期】因为日期太长了,所以要用字符串表示,

#include #include 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)//处理问题的方法:将年月日结合起来,然后进行判断 { //stoll函数将在函数调用中作为参数提供的字符串转换为long long int year=stoll(s.substr(0, 4)); month=stoll(s.substr(4, 2)); day=stoll(s.substr(6, 2)); //把年月日分割开来,分别赋值给year,month 和day //先判断year 是闰年还是平年 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); //to_string函数是将数值转化为字符串 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); }//每一个操作中要经过两个solve分贝判断回文和ABAB类型 if(solve1(s))//判断是否是回文数字 { if(!flag1) { //如果还没有找到过符合条件的,那么此时该数字就是离输入的数最近的数字 cout<<>s; solve(s); return 0; }

    推荐阅读