第八届蓝桥杯日期问题

标题:日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入

一个日期,格式是”AA/BB/CC”。 (0 <= A, B, C <= 9)

输出

输出若干个不相同的日期,每个日期一行,格式是”yyyy-MM-dd”。多个日期按从早到晚排列。

样例输入

02/03/04

样例输出

2002-03-04 
2004-02-03 
2004-03-02

资源约定: 
峰值内存消耗(含虚拟机) < 256M 
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意: 
main函数需要返回0; 
只使用ANSI C/ANSI C++ 标准; 
不要调用依赖于编译环境或操作系统的特殊函数。 
所有依赖的函数必须明确地在源文件中 #include 
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。





import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * @author Administrator
 * 2018年3月5日
 * @功能说明:第八届蓝桥杯B组第七题
 * @version: JDK1.8
 */

public class NO_7 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int yy, mm,dd;
		String str = sc.next();
		yy = Integer.parseInt(str.substring(0, 2));
		mm = Integer.parseInt(str.substring(3, 5));
		dd = Integer.parseInt(str.substring(6, 8));
		Date[] d = { new Date(1900+yy, mm, dd),new Date(2000+yy,mm,dd),
					 new Date(1900+dd, yy,mm),new Date(2000+dd,yy,mm),
					 new Date(1900+dd, mm,yy),new Date(2000+dd,mm,yy) };
		
		Arrays.sort(d);
		for(Date i : d) {
			if(i.check())
				i.print();
		}
	}
	
}

class Date implements Comparable{
	
	private int year;
	private int month;
	private int day;
	private int[] md = {0,31,28,31,30,31,3,31,31,30,31,30,31};
	
    Date(int y, int m , int d) {
		this.year = y;
		this.month = m;
		this.day = d;
	}
	/**
	 * 判断是否是闰年
	 * @param y
	 * @return
	 */	
	public boolean isSyn(int y) {
		return (y % 4 == 0) ||(y % 100 == 0 && y % 4 == 0);
	}
	/* (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	@Override
	public int compareTo(Date other) {
		if (this.year == other.year ) {
			
			if (this.month == other.month) {
				/**
				 * 如果年月相同,则按具体的天由低到高排序
				 */
				return this.day < other.day ? 1:0;
			} else {	
				return this.month < other.month? 1:0;
			}
		}
		return this.year < other.year? 1:0;
	}
	
	/**
	 * 判断日期合法性
	 * @return
	 */
	public boolean check() {
		if (year < 1960 || year >2059) {
			return false;
		} else if(month <= 0 || month > 12){
			return false;
		} else if( isSyn(year)) {
			
			if(month == 2) {
				return day >= 1 && day <= 29; 
			} else {
				return day >= 1 && day <= md[month];
			}
		} else {
			return day >=1 && day <= md[month];
		}
	}
	
	public void print() {
		System.out.printf("%d-%02d-%02d\n",year,month,day);
	}
	
}

你可能感兴趣的:(练习题)