(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;
    }
}