算法提高 日期计算
时间限制: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
int sum = (sum2 - sum1 + 12) % 7;
其实这行代码,逻辑上来讲+5和+12也可以的,但是如果+5时,此时11-11=0+5%7=2,而不是等于。。(自己想一下吧)这就错了。
for(int i=1599; i<year; i++) {
而且这行代码也要注意一下,如果时i<=year,那就算了year的整整一年的天数,这就错了喔。。
思路:
算出2011年11月11日到1599年1月1日的天数,再算出要求的日期到1599年1月1日的天数,2个作差对7取余即可求出星期几
代码如下:
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);
System.out.println(sum1+" "+sum2);
System.out.println(sum1);
if(sum1 <= sum2) {
//+5和+12也可以,+12的原因是当sum2为11!!
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,如果是i<=year,就把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;
}
}
http://blog.youkuaiyun.com/qq_25605637/article/details/54897110