不能一天一天枚举,否则会超时;
转换一下思路,不必判断这一天是不是回文数,而是给出前四位数去构造后四位数从而得到回文数;
这样就从一天一天枚举变成一年一年枚举,时间复杂度就降低了很多;
构造好回文数后只需要判断这个八位数符不符合日期的规定。
注意事项:
参考代码:
#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 人评分