1 条题解
-
0
自动搬运
来自洛谷,原作者为

Zaku
Кто не идет вперед, тот идет назад: стоячего положения нет.搬运于
2025-08-24 22:41:44,当前版本为作者最后更新于2023-02-25 18:30:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
解法
首先,这题是模拟题中的日期问题。
显而易见对于此题,我们可以进行如下分析:
- 遍历从 开始的所有回文日期。
- 判断日期是否合法。
- 找到第一个合法回文日期后输出。
- 判断该回文数是否为
ABABBABA型。 - 找到第一个
ABABBABA型回文日期后输出。 - 结束。
其中,对于判断日期是否合法,我们可以进行如下分析:
- 抽取年、月、日。
- 判断月份是否合法。
- 根据月份判断日期是否合法。
对于判断回文日期,可以采用双指针算法,
比较高级代码更为简洁。对于判断特殊情况,直接在代码中给予说明。
#include<bits/stdc++.h> using namespace std; int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//打个月份表 //判断合法 bool check_valid(int date){ int year=date/10000; int month=date%10000/100; int day=date%100;//分离年月日 if(day==0||month<=0||month>12)return false;//显然的不合法情况 if(month!=2&&day>months[month])return false;//月份不是2,day不合法就不合法 if(month==2){//月份是2 if((year%4==0&&year%100!=0)||(year%400==0))if(day>29)return false;//是闰月, day必须<=29 else if(day>28)return false;//是平月,day必须<=28 } return true; } //判断回文 bool check_huiwen(string s){ int len=s.size(); for(int i=0,j=len-1;i<j;i++,j--)//i从前往后,j从后往前扫一遍 if(s[i]!=s[j])return false;//不对称,就不回文 return true; } //判断ABABBABA bool check_ABAB(string s){ if(check_huiwen(s)){//首先它得是个回文数 //接下来只需判断前4位是否合法 if(s[0]!=s[2]||s[1]!=s[3]||s[0]==s[1])return false; //结合ABABBABA思考 return true; } return false; } int main(){ int n;cin>>n; bool flag=0; for(int i=n+1;;i++){//枚举回文数 if(check_valid(i)){//合法 string s=to_string(i);//仅在C++11标准及以后出现,比较好用 if(check_huiwen(s)&&!flag){//输出第一个回文数 cout<<i<<endl; flag=1; } if(check_ABAB(s)){//输出第一个特殊回文数 cout<<i; return 0; } } } return 0; }
- 1
信息
- ID
- 7900
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者