蓝桥杯 历届试题 日期

问题描述
  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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"。多个日期按从早到晚排列。



解题思路:

    这是2017年省赛的一道送分题。不涉及到任何复杂的算法。但是想一次写对,难度还是有的。

主要的点在闰年判断,年份时间排序,字符串转数字再生成一个新的字符串。

代码写的很乱也没有注释……建议自己做吧。

import java.io.*;
class Main{
	public static boolean jud(int year){
		if(year%4==0 && year%100!=0){
			return true;
		}
		if(year%100==0&&year%400==0){
			return true;
		}
		return false;
	}
	public static String day(int year,int month,int dayt){
		String c="";
		if(year<=59){
			if(year<10)
			c="200"+year;
			else
			c="20"+year;
			
		}
		else{
			c="19"+year;
		}
		if(month>12){
			return "";
		}
		switch (month) {
		case 1:
			if(dayt<=31){
				if(dayt<10)
				c+="-01-0"+dayt;
				else 
				c+="-01-"+dayt;
			}
			break;
		case 2:
			if(dayt<=29){
				if(dayt<10)
				c+="-02-0"+dayt;
				else if(dayt<=28)
				c+="-02-"+dayt;
				else if(dayt==29){
					if(jud(Integer.parseInt(c))){
						c+="-02-"+dayt;
					}
				}
			}
			break;
		case 3:
			if(dayt<=31){
				if(dayt<10)
				c+="-03-0"+dayt;
				else 
				c+="-03-"+dayt;
			}
			break;
		case 4:
			if(dayt<=30){
				if(dayt<10)
				c+="-04-0"+dayt;
				else 
				c+="-04-"+dayt;
			}
			break;
		case 5:
			if(dayt<=31){
				if(dayt<10)
				c+="-05-0"+dayt;
				else 
				c+="-05-"+dayt;
			}
			break;
		case 6:
			if(dayt<=30){
				if(dayt<10)
				c+="-06-0"+dayt;
				else 
				c+="-06-"+dayt;
			}
			break;
		case 7:
			if(dayt<=31){
				if(dayt<10)
				c+="-07-0"+dayt;
				else 
				c+="-07-"+dayt;
			}
			break;
		case 8:
			if(dayt<=31){
				if(dayt<10)
				c+="-08-0"+dayt;
				else 
				c+="-08-"+dayt;
			}
			break;
		case 9:
			if(dayt<=30){
				if(dayt<10)
				c+="-09-0"+dayt;
				else 
				c+="-09-"+dayt;
			}
			break;
		case 10:
			if(dayt<=31){
				if(dayt<10)
				c+="-10-0"+dayt;
				else 
				c+="-10-"+dayt;
			}
			break;
		case 11:
			if(dayt<=30){
				if(dayt<10)
				c+="-11-0"+dayt;
				else 
				c+="-11-"+dayt;
			}
			break;
		case 12:
			if(dayt<=31){
				if(dayt<10)
				c+="-12-0"+dayt;
				else 
				c+="-12-"+dayt;
			}
			break;
		default:
			break;
		}
		if(c.length()>5){
			return c;
		}
		return "";
	}
	public static void output(String [] re,int[] out){
		for(int i=0;i<3;i++){
			if(re[out[i]]!=""&&re[out[i]]!=null){
				System.out.println(re[out[i]]);
			}
		}
	}
	public static void main(String []args)throws IOException{
		BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
		String c[]=bfr.readLine().split("/");
		int A=Integer.parseInt(c[0]);
		int B=Integer.parseInt(c[1]);
		int C=Integer.parseInt(c[2]);
		int out[]={0,1,2};
		for(int i=0;i<3;i++){
			if(A>C&&C<60){
				if(A>B&&B<=12){
					out[0]=2;
					out[1]=1;
					out[2]=0;
				}
				else{
					out[0]=1;
					out[1]=2;
					out[2]=0;
				}
			}
			else if(A>B&&B<=12){
				out[0]=0;
				out[1]=2;
				out[2]=1;
			}
		}
		String re[]=new String[3];
		if(C!=0)
		re[0]=day(A,B,C);
		
		if(A==B){
			if(A==C){
				output(re, out);
				return;
			}
			if(B!=0)
			re[1]=day(C,A,B);
			output(re, out);
			return;
		}
		if(B!=0)
		re[1]=day(C,A,B);
		if(A!=0)
		re[2]=day(C,B,A);
		output(re, out);

	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值