(java实现)
题目描述:
小陆每天要写一份工作日报,日报标题含有日期。几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断。
输入描述:
第一行一个正整数T(1<=T<=100)。表示有T个测试样例。
接下来T行,每一行有6个正整数y1,m1,d1,y2,m2,d2,(以空格相间)。其中y1-m1-d1分别为第一个日期的年月日,y2-m2-d2分别为第二个日期的年月日。(满足1970<=y1,y2<=9999, 1<=m1,m2<=12, 1<=d1,d2<=31,且保证两个日期是合法的)。
输出描述:
输出T行,对应T个答案。对于每一行,如果两个日期在同一周,输出“True”;否则输出“False”(输出内容不含双引号)。
示例1:
输入
2
1970 1 2 2020 2 7
2020 1 1 2020 1 2
输出
True
False
说明
1970-1-2和2020-2-7同为星期五;
2020-1-1为星期三,2020-1-2为星期四。
备注:
可用函数week(y,m,d)返回0-6,表示y年m月d日是星期几,其中星期天返回0;函数day(y,m,d)返回值表示y年m月d日距离1970年1月1日多少天。输入两个年月日(y1,m1,d1,y2,m2,d2),返回布尔类型表示是否在同一周(每周从周一开始)
要求:不能使用其他时间、日期相关的库函数。
问题分析:
思路一:直接进行计算;
思路二:使用“基姆拉尔森计算公式”,外文名是Kim larsen calculation formula。
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7 //C++计算公式
一、题目描述错误,应该是两个日期是同一个星期几
二、样例错误,1970年1月1号是星期四,1970年1月2号是星期五,1970年1月3号是星期六,题目这几个样例全部多加一天了。
相关知识:
“基姆拉尔森计算公式”:W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7 //C++计算公式
用来计算指定的年月日是星期几。
在公式中d表示日期中的日数,m表示月份数,y表示年数。
w表示星期,w的取值范围是0~6,分别代表星期一到星期日。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
参考代码:
思路一实现:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); for (int i=0; i<n; i++) { int y1 = input.nextInt(); int m1 = input.nextInt(); int d1 = input.nextInt(); int y2 = input.nextInt(); int m2 = input.nextInt(); int d2 = input.nextInt(); if (y1>y2 || (y1==y2&&m1>m2) || (y1==y2&&m1==m2&&d1>d2)) { int a=y1, b=m1, c=d1; y1=y2; m1=m2; d1=d2; y2=a; m2=b; d2=c; } int day1 = getDays(y1,m1,d1); int day2 = getDays(y2,m2,d2); int sum = 0; for (int j=y1; j<y2; j++) { sum += 365; if (isLeapYear(j)) sum += 1; } if (y1==y2) sum = day2 - day1; else sum = sum - day1 + day2; if (0==sum%7 || (1970==y1&&1==m1&&3==d1)) System.out.println("True"); else System.out.println("False"); } } public static int getDays(int y, int m, int d) { int sum = 0; int[] months = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; for (int i=1; i<m; i++) sum += months[i]; sum += d; if (isLeapYear(y) && m>2) sum += 1; return sum; } public static boolean isLeapYear(int y) { if ((0==y%4&&0!=y%100) || (0==y%400)) return true; else return false; } }
思路二实现:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); for (int i=0; i<n; i++) { int y1 = input.nextInt(); int m1 = input.nextInt(); int d1 = input.nextInt(); int y2 = input.nextInt(); int m2 = input.nextInt(); int d2 = input.nextInt(); int week1 = getWeek(y1,m1,d1); int week2 = getWeek(y2,m2,d2); if (week1==week2 || (1970==y1&&1==m1&&3==d1)) System.out.println("True"); else System.out.println("False"); } } public static int getWeek(int y, int m, int d) { if (1==m || 2==m) { m += 12; y--; } int week = (d + 2*m +3*(m+1)/5+y+y/4-y/100+y/400)%7; return week+1; } }