解题思路:用日期遍历会超时,由于回文的特殊性,可以根据年份构造month和day;
注意事项:(注意判断构造的日期是否合法);
参考代码:
#include <iostream>
using namespace std;
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//保存每月的最后一天
bool check(int j)
{
arr[2]=28; //非闰年,2月28天,若为闰年,重新赋值为29即可
int q,p,month,day;//分离month,day
q=j%10;//第四位数
if(q==0)//year=2020,month=02(这一类情况,去零),month取第三位数即可
month=(j/10)%10;
else //例如:year=3211,month=11,month保存第四,三位数
month=q*10+(j/10)%10;
p=(j/100)%10;//第二位数
if(p==0)//year=2020,day02(这一类情况,去零),day取第一位数即可
day=(j/1000)%10;
else //例如:year=3211,day=23,day保存第二,一位数
day=p*10+(j/1000)%10;
if(j%4==0&&j%100!=0||j%400==0)//闰年处理,2月份为29天
{
arr[2]=29;
}
if(month>=1&&month<=12&&day>=1&&day<=arr[month])//如果日期合法
return true;
else
return false;
}
int main()
{
int date,year,cunt=0;
cin>>date;
year=date/10000;
for(int i=year;i<=9999;i++)//遍历年份,一开始忽略了初始输入不为回文的情况,以为这一年不用考虑,故只有91分,改了好久......
{
if(check(i))//判断年份所对应的(回文保存)month,day是否合法
{
int A1,A2,B1,B2;//分离每一位数
A1=(i/1000)%10;
A2=(i/10)%10;
B1=(i/100)%10;
B2=i%10;
int time=i*10000+B2*1000+A2*100+B1*10+A1; //根据每一位合成日期
if(cunt==0&&time!=date) //只输出一次 ,且不为输入日期
{
cout<<time<<endl;
cunt++;
}
if(A1==A2&&B1==B2&&time!=date)//ABAB型
{
cout<<time;
return 0; //结束程序
}
}
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复