[蓝桥杯][2017年第八届真题]日期问题(Java代码)AC代码!

【解题思路】

既要判断是否为合理日期(1960年1月1日至2059年12月31日,闰年2月有29天,平年2月28,大月31,小月30等),又要将日期从小到大排序,尤其是从小到大排 序,情况很复杂,很难考虑全面,所以可以考虑换个角度解题。既然日期在1960年1月1日至2059年12月31日范围内,可以从1960年1月1日(19600101)遍历到2059年12月31日(20591231),分别取出前四位作为年,中间两位作为月,最后两位作为日,判断这个日期是否是合法日期。如果是合法日期,再与输入的AA、BB、CC分别按照年月日、月日年、日月年三种方式比较,如果相等,则输出。

【注意事项】

学会转换思路很重要,一种方法行不通,就想想这个题目是不是有什么规律可以帮助我们解题,看看换个思路会怎样。

【参考代码】

import java.text.ParseException;
/*
年/月/日、月/日/年、日/月/年
日期都在1960年1月1日至1999年12月31日
        2000年1月1日到2059年12月31日
年份省略了前两位
 */
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.*;
public class Main{
    public static int month[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
     
    public static boolean Check(int y,int m,int d) {//检查是否是合法日期
        if(y<1960 || y>2059) return false;
        if(m<1 || m>12) return false;
//      1.能被4整除而不能被100整除。2.能被100整除也能被400整除。
        int flag=0;
        if(y%4==0&&y%100!=0 || y%400==0&&y%100==0) flag=1; //判断闰年
        if(d<1 || d>month[m]+flag) return false;
        return true;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        String s[] = str.split("/");
        int A = Integer.parseInt(s[0]);
        int B = Integer.parseInt(s[1]);
        int C = Integer.parseInt(s[2]);
        for(int i=19600101;i<=20591231;i++) {
            int y=i/10000;
            int m=i%10000/100;
            int d=i%100;
            if(Check(y,m,d)) {
                if(y%100==A && m==B && d==C || //年月日
                   m==A && d==B && y%100==C || //月日年
                   d==A && m==B && y%100==C) { //日月年
                    String Year = String.valueOf(y);
                    String Month = String.format("%2d",m).replace(" ","0"); //空位补0
                    String Day = String.format("%2d",d).replace(" ","0");
                    System.out.println(Year+"-"+Month+"-"+Day);
                }
                     
            }
             
        }
    }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值