输入样例:
20110101
20111231
输出样例:
1
解题思路:
找两个日期中间合法的回文数,一种直接的想法是:枚举这两个日期中间的所有日期,但在枚举时,需要考虑给出的两个日期是否在同一年,不仅需要将年份之间的日期枚举,还要将给出的那两个年份日期也要枚举,代码很冗长。
可以先找出所有可能年份的回文数,题目给出年份是四位整数,只要求出每个数字的回文数,通过判断这个回文数是否为合法的日期并且在给定的范围内求解。
Java代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
scan.close();
int ans = 0;
for(int i = 1000; i <= 9999; i++) {
int j = reverseNum(i);//1234 -> 4321
int ij = 10000 * i + j;//拼凑成同一个数
if(ij > m || ij < n) continue;//比较该回文数是否在给定的范围内
if(isValid(i, j)) ans++;
}
System.out.println(ans);
}
public static int reverseNum(int n) { //找回文串的“另一半” 6789 -> 9876
int m = 0;//翻转后的数
while(n > 0) {
m = m * 10 + n % 10;
n /= 10;
}
return m;
}
public static boolean isValid(int y, int n) {//年, 翻装后的数
int m = n / 100, d = n % 100;//得到m:月 n:日
if(m == 0 || m >= 13) return false;//判断月份是否合法
int day = getDay(y, m);//求出月份对应的合法的天数
if(d == 0 || d > day)return false;//
return true;
}
public static int getDay(int y, int m) {//通过年和月求天数
int []m1 = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int []m2 = new int[]{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0) return m2[m];
else return m1[m];
}
}