不能一天一天枚举,否则会超时;
转换一下思路,不必判断这一天是不是回文数,而是给出前四位数去构造后四位数从而得到回文数;
这样就从一天一天枚举变成一年一年枚举,时间复杂度就降低了很多;
构造好回文数后只需要判断这个八位数符不符合日期的规定。
注意事项:
参考代码:
#include<iostream> #include<cmath> using namespace std; int n; int dir[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int f(int x){ //判断闰年 if(x % 400 == 0 || x % 4 == 0 && x % 100 != 0){ return 1; } else { return 0; } } int reverse(int x){ //将前四位数翻转 int sum = 0; for(int i = 3; i >= 0; i--){ sum += x % 10 * pow(10, i); x /= 10; } return sum; } int check(int i, int t){ //判断是否符合日期的条件 int day = t % 10 + (t / 10) % 10 * 10; int month = t / 100; dir[2] = 28; //若有一年是闰年将2月改成了29,重置一下2月的日数 if(f(i)){ dir[2] = 29; } if(month >= 0 && month <= 12 && day >= 1 && day <= dir[month]){ return 1; } return 0; } int check2(int i, int t){ //判断是否是ABABBABA if(i % 10 == i / 100 % 10 && i / 10 % 10 == i / 1000){ return 1; } return 0; } int main(){ cin>>n; for(int i = n / 10000; i < 9999; i++){ int t = reverse(i); if(check(i, t)) { if(i * 10000 + t == n){ //continue掉与n为同一年的回文 continue; } cout<<i * 10000 + t<<endl; break; } } for(int i = n / 10000; i < 9999; i++){ int t = reverse(i); if(check(i, t) && check2(i, t)) { if(i * 10000 + t == n){ continue; } cout<<i * 10000 + t<<endl; break; } } }
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复