使用java的LocalDate
import java.time.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String d1=sc.next();
String d2=sc.next();
int y1=Integer.parseInt(d1.substring(0, 4));
int m1=Integer.parseInt(d1.substring(4, 6));
int day1=Integer.parseInt(d1.substring(6));
int y2=Integer.parseInt(d2.substring(0, 4));
int m2=Integer.parseInt(d2.substring(4, 6));
int day2=Integer.parseInt(d2.substring(6));
LocalDate st=LocalDate.of(y1,m1,day1);
LocalDate ed=LocalDate.of(y2,m2,day2);
long cnt=0;
// 需要特判起始日期就是终止日期
if(st.equals(ed)) {
// 取年 和月日
int year=st.getYear();
int month=st.getMonthValue();
int day=st.getDayOfMonth();
// System.out.println(day+"-->"+month);
// 补0
String mon=month+"";
if(mon.length()<2) {
mon="0"+month;
}
String da=day+"";
if(da.length()<2) {
da="0"+day;
}
String m=mon+""+da;
if(check(year+"",m)) {
System.out.println(1);
}else {
System.out.println(0);
}
return;
}
for(LocalDate i=st;!i.equals(ed);i=i.plusDays(1)) {
// 取年 和月日
int year=i.getYear();
int month=i.getMonthValue();
int day=i.getDayOfMonth();
// System.out.println(day+"-->"+month);
// 补0
String mon=month+"";
if(mon.length()<2) {
mon="0"+month;
}
String da=day+"";
if(da.length()<2) {
da="0"+day;
}
String m=mon+""+da;
String y=year+"";
if(check(y,m)) {
cnt++;
}
// System.out.println(i);
}
System.out.println(cnt);
}
public static boolean check(String y,String m) {
for(int i=0,j=m.length()-1;i<y.length();i++,j--) {
if(y.charAt(i)!=m.charAt(j)) {
return false;
}
}
return true;
}
}
正解
思路
由于一个一个枚举日期太麻烦,我们可以逆向考虑。
由于一共八位数,年份是四位数,那么年份的范围可以是1000~9999,已知年份的话,我们可以根据题目中回文的定义,写出后四位数,然后判断我们写的这个日期是否在合法范围内,也就是是否在开始日期和结束日期之间,最后再判断当前日期是否存在即可。
分为三步:
1.编写回文日期
2.判断是否在起始日期和终止日期范围内
3.判断日期是否存在
代码如下:
import java.util.*;
public class Main {
static int[] day=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int st=sc.nextInt();
int ed=sc.nextInt();
long cnt=0;
// 枚举年份 进行回文
for(int i=1000;i<=9999;i++) {
// 1. 根据年份补充后四位 构成回文日期
int date=i; // 暂时是前半部分
//写后半部分回文 组成回文日期
int x=i;
for(int j=0;j<4;j++) {
// x%10取个位
date=date*10+x%10;
x/=10;
}
// 2.判断是否在起始日期和终止日期范围内
// 这一步 只需判断数值大小即可
if(st<=date&&date<=ed) {
// 判断日期是否合法
if(check(date)) {
cnt++;
}
}
}
System.out.println(cnt);
}
public static boolean check(int x) {
// 取出年份 月份 日期
// 留几位就取余1几个0
int d=x%100;
// x%10000 先得到后四位
// x%10000/100 得到前两位
int m=x%10000/100;
int y=x/10000;
// 判断月份是否合法
if(m<1||m>12||d==0) {
return false;
}
// 判断天数是否合法 先不考虑二月
if(m!=2&&d>day[m]) {
return false;
}
// 判断二月份
if(m==2) {
//判断是否是闰年
boolean leap=y%400==0||(y%4==0&&y%100!=0);
// 由于true 表示的是 1false;表示的是0 因此我们可以借此计算二月天数
int days=day[2];
if(leap) {
days=day[2]+1;
}
if(d>days) {
return false;
}
}
return true;
}
}