算法提高 日期计算
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
输入只有一行
YYYY MM DD
YYYY MM DD
输出格式
输出只有一行
W
W
数据规模和约定
1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
1 <= MM <= 12
1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
思路:调用api
AC代码:
import java.util.Calendar;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int year,month,day;
year = in.nextInt();
month = in.nextInt();
day = in.nextInt();
Calendar cal = Calendar.getInstance();
//0表示1月份,1表示2月份
cal.set(year, month-1, day);
//1表示星期日,2表示星期一
int temp = cal.get(Calendar.DAY_OF_WEEK);
if (temp == 1)
System.out.println(7);
else
System.out.println(temp - 1);
}
}
思路:算出2011年11月11日到1599年1月1日的天数,再算出要求的日期到1599年1月1日的天数,2个作差对7取余即可求出星期几
AC代码:
import java.util.Scanner;
public class Main {
static int[] mon = {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
int sum1 = cal(2011,11,11);
int sum2 = cal(year,month,day);
if(sum1 <= sum2) {
int sum = (sum2 - sum1 + 12) % 7;
if(sum == 0)
sum = 7;
System.out.println(sum);
} else {
int sum = (sum1 - sum2) % 7;
if(sum == 0)
System.out.println(5);
else if(sum == 1)
System.out.println(4);
else if(sum == 2)
System.out.println(3);
else if(sum == 3)
System.out.println(2);
else if(sum == 4)
System.out.println(1);
else if(sum == 5)
System.out.println(7);
else if(sum == 6)
System.out.println(6);
}
}
public static int cal(int year,int month,int day) {
int sum = 0;
//注意这里是i<year
for(int i=1599; i<year; i++) {
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
sum += 366;
} else {
sum += 365;
}
}
//注意这里是i<month
for(int i=1; i<month; i++) {
//是闰年的第二月,天数是29天
if(((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) && i == 2)
sum += mon[i] + 1;
else
sum += mon[i];
}
sum += day;
return sum;
}
}