原题链接:蓝桥杯2017年第八届真题-日期问题
解题思路:
注意事项:
参考代码:
import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
/**
* 小明正在整理一批历史文献。这些历史文献中出现了很多日期。
* 小明知道这些日期都在1960年1月1日至2059年12月31日。
* 令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
* 更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
* 比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
* 给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] arr1 = str.split("/"); // 先分隔开三个日子
int num1 = Integer.parseInt(arr1[0]);
int num2 = Integer.parseInt(arr1[1]);
int num3 = Integer.parseInt(arr1[2]);
Set<String> days = new TreeSet<>(); // 自动升序并去重
if (check(num1, num2, num3)){ // 年月日
days.add(toStr(num1, num2, num3));
}
if (check(num3, num1, num2)){ // 月日年
days.add(toStr(num3, num1, num2));
}
if (check(num3, num2, num1)){ // 日月年
days.add(toStr(num3, num2, num1));
}
for (String date: days) {
System.out.println(date);
}
}
// 检查是否是合法的日期
public static boolean check(int num1, int num2, int num3) { // 以年月日的格式
boolean flag = true;
boolean leap = false;
if (num1 <= 59) {
num1 += 2000;
} else {
num1 += 1900;
}
if (num1 % 4 == 0 && num1 % 100 != 0 || num1 % 400 == 0) { // 判断闰年
leap = true;
}
if (num2 < 1 || num2 > 12){ // 判断月份合理性
flag = false;
}
if (num3 > 31 || num3 < 1) { // 判断日期合理性
flag = false;
} else if (leap && num2 == 2 && num3 > 29) {
flag = false;
} else if (!leap && num2 == 2 && num3 > 28) {
flag = false;
} else if (num2 == 4 || num2 == 6 || num2 == 9 || num2 == 11) {
if (num3 > 30) {
flag = false;
}
}
return flag;
}
// 将年月日转换为字符串
public static String toStr(int n1, int n2, int n3){
if (n1 <= 59) {
n1 += 2000;
} else {
n1 += 1900;
}
String y = String.valueOf(n1);
String m = n2 >= 10 ? String.valueOf(n2) : "0" + n2;
String d = n3 >= 10 ? String.valueOf(n3) : "0" + n3;
return y + "-" + m + "-" + d;
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复