(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;
}
}
京公网安备 11010502036488号