本题的思路
其实本题还是一个绕弯子的问题,如果我们从10000101到89991231的方法去一个个向上暴力枚举的话,那就非常耗时了,其实我们可以发现,回文固定长度为8,那也就是前面的年,会等于后面月日,那么我们就只需要举出年也就是1000到8999这个范围的年份,看它反转以后的数据是否满足月份的要求即可,所以本题就是枚举年份,反转求月日,即可
注意可能出现a=b的情况,这种数据不能说是ababbaba式的,要注意要去掉
代码如下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main回文日期 {
public static void main(String[] args) throws IOException {
StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
x.nextToken();
int n=(int)x.nval;
int qb=n/10000;//独立出年
StringBuffer ss=new StringBuffer();
boolean f=true;//标记是否找到非ababbaba式的年月日
for(int i=qb;i<10000;i++) {
ss.delete(0, ss.length()+1);//清除前面的数据
ss.append(i);
int j=Integer.valueOf(ss.reverse().toString());//翻转
int q=j/100,p=j%100;
//判断月日是否合法
if(q>12||q<1||p>31||p<1)
continue;
else if((q==4||q==6||q==9||q==11)&&p>30)
continue;
else if(q==2&&((i%4==0&&i%100!=0||i%400==0)?(p>29?true:false):(p>28?true:false)))
continue;
else if(i==qb&&j<n%10000)
continue;
else {
if(f) {
f=false;//标记已经出现了非的年月
System.out.println(ss.reverse().toString()+ss.reverse());
}
if(q==p&&p%10!=p/10%10) {//ababbaba式的要注意不能aaaaaaa式的
System.out.println(ss.reverse().toString()+ss.reverse());
break;
}
}
}
out.flush();
}
}