栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1229. 日期问题 Java题解 (枚举) 【第八届蓝桥杯省赛C++B组,JAVA B组】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1229. 日期问题 Java题解 (枚举) 【第八届蓝桥杯省赛C++B组,JAVA B组】

输入样例:

02/03/04

输出样例: 

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

解题思路:

可以顺着题意将三个数所有可能组成的情况枚举出来,并判断是否为合法的日期,将符合条件的保存至set,最后输出,其中年份有19开头的和20开头的均需枚举。

也可以逆向的在两个日期之间遍历,在合法日期的前提下找出符合三种格式的日期,即保证了有序,也不会有重复结果。

Java代码:(顺向)
import java.io.*;
import java.util.TreeSet;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split("/");
		int a = Integer.parseInt(split[0]);
		int b = Integer.parseInt(split[1]);
		int c = Integer.parseInt(split[2]);
		
		TreeSet set = new TreeSet<>();//自动去重,排序
		if(isValid(a + 2000, b, c)){
			set.add(String.format("%d-%02d-%02d", a + 2000, b, c));
		}
		if(isValid(c + 2000, a, b)){
			set.add(String.format("%d-%02d-%02d", c + 2000, a, b));
		}
		if(isValid(c + 2000, b, a)){
			set.add(String.format("%d-%02d-%02d", c + 2000, b, a));
		}
		if(isValid(a + 1900, b, c)){
			set.add(String.format("%d-%02d-%02d", a + 1900, b, c));
		}
		if(isValid(c + 1900, a, b)){
			set.add(String.format("%d-%02d-%02d", c + 1900, a, b));
		}
		if(isValid(c + 1900, b, a)){
			set.add(String.format("%d-%02d-%02d", c + 1900, b, a));
		}
		for(String data: set) 
			System.out.println(data);
		
	}
	
	public static boolean isValid(int y, int m, int d) {
		int []m1 = new int[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		int []m2 = new int[] {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if(m == 0 || m > 12) return false;
		if(y < 1960 || y > 2059) return false;
		if(isLeap(y)) 
			if(d == 0 || d > m2[m]) return false;
		if(!isLeap(y)) 
			if(d == 0 || d > m1[m]) return false;
		return true;
	}
	public static boolean isLeap(int y) {
		if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)return true;
		return false;
	}
}
Java代码:(逆向)

 

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split("/");
		int a = Integer.parseInt(split[0]);
		int b = Integer.parseInt(split[1]);
		int c = Integer.parseInt(split[2]);
		
		for(int i = 19600101; i <= 20591231; i++) {
			int y = i / 10000, m = i % 10000 / 100, d = i % 100;
			if(isValid(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)
					System.out.printf("%d-%02d-%02dn", y, m, d);
		}
	}
	
	public static boolean isValid(int y, int m, int d) {
		int []m1 = new int[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		int []m2 = new int[] {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if(m == 0 || m > 12) return false;
		if(y < 1960 || y > 2059) return false;
		if(isLeap(y)) 
			if(d == 0 || d > m2[m]) return false;
		if(!isLeap(y)) 
			if(d == 0 || d > m1[m]) return false;
		return true;
	}
	public static boolean isLeap(int y) {
		if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)return true;
		return false;
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783982.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号