【日期问题】 蓝桥杯 历届试题 java

查看题目

总结

  1. 先写一个 判断是否为闰年的函数(代码中的fun函数)
  2. 再写一个 判断(年月日)日期是否合理存在 的函数(代码中的fun1函数)
  3. 再写一个 去重且日期格式化的函数(代码中的out函数)
  4. 在main函数中,把输入的字符串日期拆分成三个数字x,y,z,依题知,x,z可以是年份,【分析题目:这些日期都在1960年1月1日至2059年12月31日】,则 0<= x或z <=59 (年份前缀是20), 60<= x或z <=99 (年份前缀是19)
  5. 接下来分为以下四种情况,
    x<=59 && z>=60
    x>=60 && z<=59
    x>=60 && z>=60
    x<=59 && z<=59
    例如第一种情况,x为20_ 的年份,z为19 _的年份,
    【分析题目:多个日期从早到晚排列】,则先考虑输出以z为年份的日期,【分析题目:月/日/年,日/月/年,则z为年份,x、y为月、日或者日、月】,所以根据x和y的大小,数字小的月份先输出;
    之后输出以x为年份的日期,【分析题目:年/月/日,则x为年份,y、z为月、日】,所以根据x和y的大小,数字小的月份先输出;以此类推。

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import java.math.*;

public class Main {
	static List<String> list2 = new ArrayList<String>();
	static String ss="";
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		
		String str=cin.next();
		
		int x=Integer.valueOf(str.substring(0,2));
		int y=Integer.valueOf(str.substring(3,5));
		int z=Integer.valueOf(str.substring(6,8));
		
		if(x<=59 && z>=60) {
			//z作为年份
			if(x<=y) {
				if(fun1(1900+z,x,y)==true) {
					out(1900+z,x,y);
				}
			}
			if(fun1(1900+z,y,x)==true && x!=y) {
				out(1900+z,y,x);
			}
			if(x>y) {
				if(fun1(1900+z,x,y)==true) {
					out(1900+z,x,y);
				}
			}
			
			//x作为年份
			if(fun1(2000+x,y,z)==true) {
				out(2000+x,y,z);
			}
		}else if(z<=59 && x>=60) {
			//x作为年份
			if(fun1(1900+x,y,z)==true) {
				out(1900+x,y,z);
			}
			
			//z作为年份
			if(x<=y) {
				if(fun1(2000+z,x,y)==true) {
					out(2000+z,x,y);
				}
			}
			if(fun1(2000+z,y,x)==true && x!=y) {
				out(2000+z,y,x);
			}
			if(x>y) {
				if(fun1(2000+z,x,y)==true) {
					out(2000+z,x,y);
				}
			}
		}else if(x>=60 && z>=60) {  
			//x作为年份
			if(x<=z) {
				if(fun1(1900+x,y,z)==true) {	
					out(1900+x,y,z);
				}
			}
			
			//z作为年份
			if(x<=y) {
				if(fun1(1900+z,x,y)==true) {
					out(1900+z,x,y);
				}
			}
			if(fun1(1900+z,y,x)==true && x!=y) {
				out(1900+z,y,x);
			}
			if(x>y) {
				if(fun1(1900+z,x,y)==true) {
					out(1900+z,x,y);
				}
			}
			
			//x作为年份
			if(x>z) {
				if(fun1(1900+x,y,z)==true) {	
					out(1900+x,y,z);
				}
			}
			
		}else if(x<=59 && z<=59) {
			
		
			//x作为年份
			if(x<=z) {
				if(fun1(2000+x,y,z)==true) {	
					out(2000+x,y,z);
				}
			}
			
		
			//z作为年份
			if(x<=y) {
				if(fun1(2000+z,x,y)==true) {
					out(2000+z,x,y);
				}
			}
			if(fun1(2000+z,y,x)==true && x!=y) {
				out(2000+z,y,x);
			}
			if(x>y) {
				if(fun1(2000+z,x,y)==true) {
					out(2000+z,x,y);
				}
			}
			
			//x作为年份
			if(x>z) {
				if(fun1(2000+x,y,z)==true) {
					out(2000+x,y,z);
				}
			}
		}
		
		
		
	
	}
	public static boolean fun(int year) {
		if((year%4==0 && year%100!=0) || (year%400==0)) 
			return true;  //是闰年
		else return false;
	}
	
	public static boolean fun1(int year,int month,int day) {
		List<Integer> list1 = new ArrayList<Integer>();
		list1.add(1);list1.add(3);list1.add(5);list1.add(7);
		list1.add(8);list1.add(10);list1.add(12);
		if(list1.contains(month)) {
			if(day<=31 && day>0) return true;
		}else if(!list1.contains(month) && month!=2 && month>0 && month<13) {
			if(day<=30 && day>0) return true;
		}else if(month == 2) {
			if(fun(year)==true && day<=29 && day>0) return true;
			if(fun(year)==false && day<=28 && day>0) return true;
		}
		
		return false;
		
	}
	public static void out(int year,int month,int day) {
		ss="";
		ss=String.valueOf(year)+"-";
		if(month<=9 && month>0) ss+="0";
		
		ss+=String.valueOf(month)+"-";
		
		if(day<=9) ss+="0";
		ss+=String.valueOf(day);
		
		if(!list2.contains(ss)) {
			list2.add(ss);
			System.out.println(ss);
		}
		
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值