特殊回文日期直接判断法:初判合法 + 回文 + 判ABAB BABA
题目描述
输入包含一个八位整数 N,表示日期。
输出格式:
输出两行,每行 1 个八位数。
第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
注意:
下一个回文日期和下一个 ABABBABA 型的回文日期可能是同一天。
ABABBABA 型的回文日期,需要满足 A≠B。
样例
输入:
20200202
输出:
20211202
21211212
C++ ac代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int check(int node){
int y = node/10000,m = (node/100)%100,d = node%100;
if(m>12||m<=0||d<=0) return 0;
if(m!=2&&d>month[m]) return 0;
if(m==2){
int leap = y%4==0&&y%100||y%400==0;
if(d>month[m]+leap) return 0;
}
return 1;
}
int huiwen(int node){
int ans = 0;
int t = node;
while(node){
ans = ans*10 + node%10;
node = node/ 10;
}
if(ans==t) return 1;
else return 0;
}
int huiabab(int node){
int x=node/10000,y = node%10000;
if(huiwen(node)){
if((x%100==x/100)&&(y%100==y/100)&&x!=y) return 1; //这里的判断
}
return 0;
}
int main(){
int n;
scanf("%d",&n);
for(int i= n+1;i<= 99999999;i++){ //注意枚举范围 不然会答案错误233~
if(check(i)&&huiwen(i)){
printf("%d\n",i);
break;//break不要忘记了! 不然就是超时或者运行时错误~~~
}
}
for(int i =n+1;i <=99999999;i++){
if(check(i)&&huiabab(i)){
printf("%d\n",i);
break;
}
}
return 0;
}