某公司每月要举行一次或者多次聚餐,由团队领导随机桃选当月的一周的某一天,公司档案记录的是某年某月第几个周周几这样的记录,有一天领导希望能够管理一下,将这些记录转换为公历日期,由于历史记录众多,秘书MM觉得手动去查很辛苦,需要身为程序员的你帮忙解决下,将这些记录转换为公历日期
1其中有一部分记录记错了,比如2018年2月第8周周一;对于这种不可能存在的也要进行异常处理:当输入不合法时输出0
2、每月的第一周和最后一周 般都不完整;例如第一周可能没有周一,周二,最后一周可能没有周六,周日;在这种异常情况下,要求输出第一周的周一,显然不存在,这个时候需要按照异常处理,输出0。
3、设定2000年1月1日为周六;为了简化题目,测试用例的年份均大于2000年,年份的取值范围为2000~9999
4、另:闰年2月份是29天;闰年:被4整除且不能被100整除的年份,或者能被400整除的年份为闰年。
输入描述:
输入为任意的年月周周几输入格式为:
YYYY空格MM空格W空格D
说明:YYYY表示年,空格表示空格符,MMm表示月份(01~12),W表示第几周(1~9),D表示周几(1~7,分别表示周一,周二,周三.周日)例如:
2018 02 3 1表示为2018年2月第三周的周一2018 02 8 1表示2018年2月第八周的周一
输出描述:
输出为正常的日期格式YYYY-MM-DD
说明:
YYYY表示年,MM表示月,DD表示日
如上述输入描述例子对应的输出分别为2018-02-12
输入
2018 02 3 1
输出
2018-02-12
import java.util.*;
public class t1 {
static int[] year=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int year=sc.nextInt();
int month=sc.nextInt();
int week=sc.nextInt();
int t=sc.nextInt();
int res=CaculateDay(year,month,week,t);
if(res==0)
System.out.println(0);
else
System.out.println(year+"-"+String.format("%02d",month)+"-"+String.format("%02d",res));
}
public static int CaculateDay(int yy,int mm,int w,int n){
if(yy>9999||yy<2000)
return 0;
if(mm<1||mm>12)
return 0;
if(w<1||w>6)
return 0;
if(n<1||n>7)
return 0;
int res=CaculateWeekDay(yy,mm);
//System.out.println(res);
if(w==1&&n<res){
return 0;
}
int d=7-res+1+(w-2)*7+n;
return d;
}
public static int CaculateWeekDay(int yy,int mm){
//计算每年的第一天是周几,公元1年是周一,计算现在与公元一年相差的天数,闰年要额外+1
int res=((yy-1)/4-(yy/100)+(yy/400)+(yy-1)*365)%7+1;
//System.out.println(res);
//计算每年的mm月的第一天是周几
int day=0;
for(int i=0;i<mm-1;i++){
day+=year[i];
}
if(mm>2&&isLeapyear(yy)==1)
day++;
res=(res+day%7)%7;
//System.out.println(res);
return res;
}
public static int isLeapyear(int o){
if((o%400!=0&&o%4==0)||o%400==0)
return 1;
return 0;
}
}