解题思路:

注意事项:

参考代码:

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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区