解题思路:

注意事项:

参考代码:

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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论