有点长有耐心的来(本题第二篇题解)
2026-08-22 13:26:19
发布于:广东
10阅读
0回复
0点赞
首先用我们聪明的大脑认识一下回文
回文:从左到右读和从右到左读一样
例子:奥利奥 123454321 123321
**注意 一个字(或数字)也是回文串**
理论是懂了 那么如何在代码当中实现呢
如果想要比较便捷的判断单个回文 推荐使用字符串来判断
但是我们输入的是数字 ,如果用字符串的话后续操作过于麻烦
所以可以请出一个神秘的函数
string s=to_string(x);
通过如上代码 可以把x以字符串的形式存在s当中
那么我们又该如何判断他正着读和反着读是否一样呢?
这个时候又要请出另一个神秘的函数
string ss=reverse(s,begin(),s.end());//括号里面填开始下标和结束下标
通过如上代码 可以把s翻转后的字符串存在ss当中
那么我们就可以写一个check函数,来判断一个数字是不是回文数
如下↓
bool check(int x){
string s=to_string(x);
string ss=s;
reverse(s.begin(),s.end());
return ss == s;
}
那么我们敏锐的眼睛捕捉到题目下方
对于60%的数据 满足date1等于date2
意思就是说这两个日期表示的是同一个数
那么我们就可以输入data1 来调用check 如果返回true输出1,反则输出0
代码以及得分如下:

如果你是要骗分的到这里可以退出了(为啥csp复赛的题没有这么水的)
那么我们可以以数字形式输入两个日期,并且遍历他们之间的每一个数(实测不会TLE)
然后通过除法和取余强强联手搭配 获得年份,月份,日期的数字
代码如下↓
int year=i/10000; //直接获取前四位
int month=(i/100)%100; //去掉后两位 获取新的数字的后两位
int date=i%100; //获取后两位
int maxx=m[month]; //下面会讲
然后判断日期合不合法 (是人都知道吧)
if(month>12||month<1) continue;
if(date<1||date>31) continue;
注意了注意了(敲黑板)
我们还要判断这个年份 月份 日期之间是否合法(即日期在不在月份的范围内)
我们可以弄一个日期数组,下标代表月份 如下↓
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//注意m[0]=0
2月份默认为28天 后面特判再另外处理
然后判断闰年,详见题目 代码如下 ↓
if( ( (year%4==0 && year%100!=0) || (year%400==0) ) && month==2 ){
maxx++;//即如果是2月份且是闰年 则这个天数的上限加1
}
然后判断日期在不在这个maxx内就可以了
奉上AC代码
#include<bits/stdc++.h>
using namespace std;
bool check(int x){
string s=to_string(x);
string ss=s;
reverse(s.begin(),s.end());
return ss == s;
}
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int s1,s2;
cin>>s1>>s2;
int ans=0;
for(int i=s1;i<=s2;i++){
int year=i/10000;
int month=(i/100)%100;
int date=i%100;
int maxx=m[month];
if(month>12||month<1) continue;
if(date<1||date>31) continue;
if( ( (year%4==0 && year%100!=0) || (year%400==0) ) && month==2 ){
maxx++;
}
if(date>maxx) continue;
if(check(i)) ans++;
}
cout<<ans;
return 0;
}
感谢你可以看到这里 ,我是刚来acgo的人 可以关注/点赞我吗?


The end 完结撒花
这里空空如也



有帮助,赞一个