【题目描述】
【思路】
要保证日期是输出的升序,那么在枚举的时候可以年月日一起枚举,这样日期是严格递增的。
然后在判断日期是否合法,即在历史上是否真实存在。
最后输出使用System.out.printf(“%d-%02d-%02d\n”, y, m, d);可以保证前导0的存在。
import java.io.*;
public class Main{
//时间范围:1960年1月1日至2059年12月31日
static int days [] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public static boolean isLeap(int y){
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
public static boolean check(int y, int m, int d){
if( m <= 0 || m > 12 || d <= 0 || d > 31) return false;
if( m != 2 && d > days[m] ) return false;
//闰年二月
if( m == 2 && isLeap(y) )
return d <= 29;
//平年二月
return d <= days[m];
}
public static void main(String args[])throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s[] = bf.readLine().split("/");
int f[] = new int[3];
for(int i = 0; i < 3; i ++) f[i] = Integer.parseInt(s[i]);
// 年/月/日的,有采用月/日/年的,还有采用日/月/年的
// 多个日期按从早到晚排列 所以升序枚举
for(int i = 19600101; i <= 20591231; i ++){
int y = i /10000, m = i % 10000 / 100, d = i % 100;
if(check(y, m, d)){//判断日期是否有效
if( y % 100 == f[0] && m == f[1] && d == f[2] // 年/月/日
|| y % 100 ==f[2] && m == f[0] && d == f[1] // 月/日/年
||y % 100 ==f[2] && m == f[1] && d == f[0] // 日/月/年
)
System.out.printf("%d-%02d-%02d\n", y, m, d);
}
}
}
}