不能一天一天枚举,否则会超时;

转换一下思路,不必判断这一天是不是回文数,而是给出前四位数去构造后四位数从而得到回文数;

这样就从一天一天枚举变成一年一年枚举,时间复杂度就降低了很多;

构造好回文数后只需要判断这个八位数符不符合日期的规定。

注意事项:

参考代码:

#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 人评分

  评论区

你这个应该是样例太少才过了,你是直接判断前四位,那么当输入20211203的时候,你这个会输出20211202,就不符合在日期之后了
2023-01-21 17:31:26
  • «
  • 1
  • »