202052 - 序号5 - (4399-2020年)

(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;
    }
}
全部评论

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本&nbsp;专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴&nbsp;快手&nbsp;去哪儿&nbsp;小鹏汽车&nbsp;不知名的一两个小厂其中字节13场&nbsp;两次3面挂&nbsp;两次2面挂&nbsp;一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂&nbsp;最后一次到录用评估&nbsp;至今无消息滴滴三面完&nbsp;没几天挂了&nbsp;所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通&nbsp;至今无消息小鹏汽车hr&nbsp;至今无消息美团2面挂&nbsp;然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂&nbsp;这个是我菜,面试官太牛逼了拼多多二面挂&nbsp;3道题也全写了&nbsp;也没问题是回答不出来的&nbsp;泡一周后挂腾讯面了5次&nbsp;一次2面挂&nbsp;三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务