(详细)《美国节日》:某月的第几个星期几

news2025/1/15 21:56:34

目录

一、题目描述:

 二、思路:

1、给定 年月日,如何知道这天是星期几?

2、已知这个月的第一天是星期几,如何知道第三个星期一是几号?

3、最后一个星期一

 三、思路总结

四、代码 


一、题目描述:

美国节日   美国节日

和中国的节日不同,美国的节假日通常是选择某个月的第几个星期几这种形式,因此每一年的放假日期都不相同。具体规则如下:
* 1月1日:元旦
* 1月的第三个星期一:马丁·路德·金纪念日
* 2月的第三个星期一:总统节
* 5月的最后一个星期一:阵亡将士纪念日
* 7月4日:美国国庆
* 9月的第一个星期一:劳动节
* 11月的第四个星期四:感恩节
* 12月25日:圣诞节
现在给出一个年份,请你帮忙生成当年节日的日期。

输入描述:
        输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。

输出描述:
        对应每一组数据,以“YYYY-MM-DD”格式输出当年所有的节日日期,每个日期占一行。

        每组数据之后输出一个空行作为分隔。

示例1:
输入:
2014
2013
输出:
2014-01-01
2014-01-20
2014-02-17
2014-05-26
2014-07-04
2014-09-01
2014-11-27
2014-12-25

2013-01-01
2013-01-21
2013-02-18
2013-05-27
2013-07-04
2013-09-02
2013-11-28
2013-12-25

 二、思路:

        每年的第一天的星期几是不固定的,进而每个月的第一天是星期几也是不固定的,因此我们需要计算。

        我们要求解这个题目主要有两个大问题需要考虑:

  • 1、给定 年月日 ,如何知道这天是星期几?
  • 2、已知这个月的第一天是星期几,如何知道第三个星期一(第一个星期一...)是几号?

1、给定 年月日,如何知道这天是星期几?

        我们需要找到一个基准值

例如:已知今天是 2023-4-11 星期二,问2023-4-20 是星期几?

(2023-4-20) - (2023-4-11)= 9 天 ,因此 9 % 7 = 2,则2023-4-20就是 (2 + 2)% 7 = 4

         该题目中,我们以公元前1年12月31日作为基准值,已知这一天是星期7  。

(年 - 月 - 日)-(0000-12-31)= 一共多少个整年的天数 + 最后一年的天数。

例如:找 2023年 4月 11日是星期几,我们先要知道从2023-4-11到 0000-12-31 一共有多少天。

(2023-4-11)-(0000-12-31)= (0000~2023)中间年的天数 + 2023开始后面的天数(不够一年)

(1)要计算(0000~2023)中间年的天数:

0000-12-31是最后一天,因此 2023 - 0001 是中间差的年数,即(2023 - 1),说明中间有2022个年份,因此(年 - 1)。我们这里先默认这些中间的年份都是平年,因此如果有闰年的话,整体上 加上 闰年的个数 * 1(因为闰年比平年要多一天)即可。

因此公式就转化成:

(年 - 月 - 日)-(0000-12-31)= (年 - 1)* 365 + 中间闰年个数 * 1 + 最后一年的天数。

① 计算中间闰年的个数,[1,y)有多少个闰年:

        闰年:能被400整除 || 能被4整除但不能被100整除

以上面的例子来说:

(2023-4-11)-(0000-12-31) = (2023-1)*365 + 中间闰年个数*1 + 最后一年的天数

现在已知有 2022个年,要计算这2022个年中有多少年是闰年

 要计算这2022个年中有多少个年就可以写成:

2022 / 4 - 2022 / 100 + 2022 / 400

即:可以被 4 整除的年数(y - 1)/ 4 减去 可以被100整除的年数(y - 1)/ 100 加上 可以被400整除的年数(y - 1)/ 400 。

注意:计算[ 1 , 2022 ]中有多少个数可以被 4 整除,可以直接用 2022 / 4 即可。

此时公式就转化为:(年月日用 y-m-d替换)

(y-m-d)-(0000-12-31)= (y - 1)* 365 +(y - 1)/ 4 - (y - 1)/ 100 + (y - 1) / 400 + 最后一年的天数

        因为星期一到星期天是7天一循环,而 对于 365 来说,本身就包含了很多个 7 的整数倍了,因此这里面的所有的 7 的整数倍 都可以无视掉。

365 % 7 = 1,364为 7 的整数倍,对应到星期的循环中,相当于又到星期一(最开始的时候)了。因此我们可以用 1 替换 365,最后计算的效果是一样的。

公式就变成了:  

(y-m-d)-(0000-12-31)= (y - 1) +(y - 1)/ 4 - (y - 1)/ 100 + (y - 1) / 400 + 最后一年的天数

② 最后一年的天数 :

        每个月的天数是固定的(假设是平年),因此我们可以得到一个存放每个月天数的数组。

假设要求 6 月 8日 在这年里是多少天,就要求 [1,5] 月的天数是多少,最后加上 6 。此时还要判断该年是否是闰年,如果是闰年,且要求的日期在 2 月之后(2月之前闰年和平年没区别),还要在总天数后 + 1 。

因此:

最后一年的天数 = 经过完整的月的天数之和 + d + (闰年?1:0)   (判断是否在 2 月之后)

2、已知这个月的第一天是星期几,如何知道第三个星期一是几号?

        以题中 求第三个星期一为例。

已知4月1日是星期五,求 4月的第三个星期一是几号?

 依次类推,如果4月1日是星期天、星期一、星期二......

        如果求第一个星期一:

因此我们可以总结出一个规律:

假设要找第 n 个星期 x :

(n - 1) * 7 +1 + (7 - w + x) % 7

3、最后一个星期一

        找到下个月的1日的星期数。

题目中找5月的最后一个星期一,因此我们找到该年的 6月1日是星期几,然后将6月1日看做 5月32日。

 三、思路总结

题目分析:

1、给定年月日,如何知道这一天是星期几?

(1)先要知道给定的年月日,距离基准值(0000-12-31)的天数

天数:(y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400 + 最后一年的天数

最后一年的天数:经过的完整的月的天数 + d + (闰年?1:0)

(2)知道了距离基准值的天数,根据基准值(0000-12-31 星期 7),计算是星期几

星期几 = (天数 % 7) == 0 ? 7:(天数 % 7)

因为基准是 7 1 2 3 4 5 6 ,因此当 天数 % 7为 0的时候,就是第一个数字 7,而其他的来说(天数 % 7)刚好算出来的数字就对应了星期几。

2、已知1日是星期w,计算第n个星期x:

(n - 1) * 7 +1 + (7 - w + x) % 7

3、已知5月1日是星期w,计算最后一个星期一 

32 - (w == 1? 7 : w - 1) 

4、输入输出处理

        题目中输出的日期形式:2013-01-01,用printf来格式化输出时,要用 %02d 来表示后面"01"的形式。

%d :正常输出十进制数 。

%Yd:十进制数,输出 Y 位。如果本身大于 Y 位,正常输出。

%XYd:十进制数,输出 Y 位,不足 Y 位就补 X 。如果本身大于 Y 位,正常输出。

%d:十进制数正常输出 。

%2d:十进制数,输出 2 位。如果本身大于 2 位,正常输出。

%02d :十进制数,输出 2 位,不足 2 位就补 0 。如果本身大于 2 位,正常输出。

四、代码 

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:美国节日
 * 1月的第三个星期一:马丁·路德·金纪念日
 * 2月的第三个星期一:总统节
 * 5月的最后一个星期一:阵亡将士纪念日
 * 7月4日:美国国庆
 * 9月的第一个星期一:劳动节
 * 11月的第四个星期四:感恩节
 * 12月25日:圣诞节
 * User: WangWZ
 * Date: 2023-04-11
 * Time: 15:39
 */
public class Main2 {
    //判断是否是闰年
    private static boolean isLeapYear(int y) {
        return ((y % 400 == 0)||(y % 4 == 0 && y % 100 != 0));
    }
    //判断最后一年的天数
    private static int lastDays(int y, int m, int d) {
        int[] arr = {31,28,31,30,31,30,31,31,30,31,30,31};
        int ans = 0;
        for (int i = 0; i < m - 1; i++) {
            ans += arr[i];
        }
        //最后计算不满的一个月的天数
        //需要进行闰年的判断
        ans += d;
        if(m > 2 && isLeapYear(y)) {
            ans += 1;
        }
        return ans;
    }
    //已知年月日,根据基准(0000-12-31 星期 7)判断有多少天
    private static int nDays(int y, int m, int d){
        return (y - 1) + (y - 1)/4 - (y - 1)/100 + (y - 1)/400 + lastDays(y,m,d);
    }
    //1.给定 年月日 ,如何知道这天是星期几?
    public static int week(int y, int m, int d) {
        //给定年月日,要确定这天是星期几:
        //1.先要知道给定的年月日,距离基准值(0000-12-31)的天数
        //天数:(y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400 + 最后一年的天数
        //最后一年的天数:经过的完整的月的天数 + d + (闰年?1:0)
        //2.知道了距离基准值的天数,根据基准值(0000-12-31 星期 7),计算是星期几
        //星期几 = (天数 % 7) == 0 ? 7:(天数 % 7)
        //因为基准是 7 1 2 3 4 5 6 ,因此当 天数 % 7为 0的时候,就是第一个数字 7,
        //而其他的来说(天数 % 7)刚好算出来的数字就对应了星期几
        int days = nDays(y,m,d);
        int w = days % 7;
        return (w == 0)?7:w;
    }
    //2.已知这个月的第一天是星期几,如何知道第三个星期一(第一个星期一...)是几号
    //(1)已知 1日是星期 w,计算第 n个星期 x是几号
    private static int m1(int n, int x,int w) {
        return (n - 1)* 7 + 1 + (7 - w + x)% 7;
    }
    //(2)根据 6月 1日是星期w,求 5月的最后一个星期一 是几号
    private static int m2(int w) {
        return 32-((w == 1)?7:w - 1);
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNextInt()) {
            int y = scanner.nextInt();
            //1月1日:元旦
            System.out.printf("%d-01-01\n", y);
            //1月的第三个星期一:马丁·路德·金纪念日
            int w = week(y,1,1);
            System.out.printf("%d-01-%02d\n", y,m1(3,1,w));
            //2月的第三个星期一:总统节
            w = week(y,2,1);
            System.out.printf("%d-02-%02d\n", y,m1(3,1,w));
            //5月的最后一个星期一:阵亡将士纪念日
            w = week(y,6,1);
            System.out.printf("%d-05-%02d\n",y,m2(w));
            //7月4日:美国国庆
            System.out.printf("%d-07-04\n", y);
            //9月的第一个星期一:劳动节
            w = week(y,9,1);
            System.out.printf("%d-09-%02d\n", y,m1(1,1,w));
            //11月的第四个星期四:感恩节
            w = week(y,11,1);
            System.out.printf("%d-11-%02d\n",y,m1(4,4,w));
            //12月25日:圣诞节
            System.out.printf("%d-12-25\n",y);
            System.out.println();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习---集成学习报告

1.原理以及举例 1.1原理 集成学习&#xff08;Ensemble Learning&#xff09;是一种机器学习策略&#xff0c;它通过结合多个基学习器&#xff08;base learners&#xff09;的预测来提高模型的性能。集成学习的目标是创建一个比单个基学习器更准确、更稳定的最终预测模型。这…

力扣---LeetCode面试题17.04.消失的数字

文章目录前言面试题17.04.消失的数字方法一&#xff1a;方法二&#xff1a;异或解析&#xff1a;方法三&#xff1a;总结前言 我有我要赶去的远方&#xff0c;风雨兼程披星戴月 本章的内容是力扣每日随机一题的部分方法的解析 提示&#xff1a;以下是本篇文章正文内容&#xf…

安全防御 --- 恶意代码、防病毒

一、恶意代码 1、按照传播方式分类 &#xff08;1&#xff09;病毒 概念&#xff1a;病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0…

2023.04.09 学习周报

文章目录摘要文献阅读1.题目2.摘要3.简介4.本文贡献5.传统方法6.IDLSTM-EC7.实验7.1 数据集7.2 基线7.3 评估指标7.4 实验结果8.结论9.展望MDS降维算法1.基本思想2.优化目标3.数学推导4.算法流程马尔可夫链1.随机过程2.简介3.数学定义4.转移概率矩阵5.状态转移矩阵的稳定性Navi…

Python 访问 PostgreSQL

文章目录一、前言1.1 概述1.2 什么是 Psycopg二、操作 PostgreSQL2.1 连接数据库2.2 异常处理2.3 创建表2.4 INSERT 操作2.5 SELECT 操作2.6 UPDATE 操作2.7 DELETE 操作2.8 事务管理2.9 调用存储函数2.10 批量操作一、前言 1.1 概述 Python 是一种高级、通用的解释型编程语言…

排序算法之希尔排序

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;快给我点赞赞&#x1f497; 文章目录1. 希尔排序2. 算法思路3. 算法实现4. 算法性能分析&#x1f49e;总结&#x1f49e;1. 希尔排…

自己再造一个大规模预训练语言模型?可以的

1. 引言 自ChatGPT发布至今已近半年&#xff0c;一路走来&#xff0c;我们可以清楚地看到的一个趋势是&#xff0c;到了下半年&#xff0c;每位研究者都会拥有一个类似ChatGPT的模型。这种现象与当年BERT推出后&#xff0c;各种BERT变体层出不穷的情况颇为相似。实际上&#x…

Prophet学习(一) Python API实现

目录 Python API 详细介绍 完整代码&#xff1a; Python API 详细介绍 Prophet遵循sklearn模型API。我们创建Prophet类的实例&#xff0c;然后调用它的fit和predict方法。 Prophet的输入总是一个有两列的数据帧:ds和y。ds(日期戳)列应该是Pandas期望的格式&#xff0c;理想…

APIs --- DOM事件进阶

1. 事件流 事件流指的是事件完整执行过程中的流动路径 任意事件被触发时总会经历两个阶段&#xff1a;【捕获阶段】和【冒泡阶段】 事件捕获 概念&#xff1a;从DOM的根元素开始去执行对应的事件&#xff08;从外到里&#xff09; 捕获阶段是【从父到子】的传导过程 代码&…

基于SSM框架开发的小区物业管理系统JavaWeb项目源码

随着信息化时代的到来&#xff0c;小区的管理也日趋完善&#xff0c;开始逐步采用信息化系统对小区业主进行管理&#xff0c;对一些业务进行线上处理。小区物业管理系统正是为了满足这种需求而诞生的&#xff0c;也有不少同学会选择该课题作为毕业设计项目选题&#xff0c;下面…

【Unity入门】9.帧更新

【Unity入门】帧更新 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;获取挂载对象的属性信息 &#xff08;1&#xff09;获取名字信息 首先在C#代码中&#xff0c;this代表着脚本本身&#…

MySQL 事务和视图

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Machine Learning-Ex3(吴恩达课后习题)Multi-class Classification and Neural Networks

目录 1. Multi-class Classification 1.1 Dataset 1.2 Visualizing the data 1.3 Vectorizing Logistic Regression 1.3.1 Vectorizing the cost function&#xff08;no regularization&#xff09; 1.3.2 Vectorizing the gradient&#xff08;no regularization&#…

【ESP-IDF】如何安装ESP-IDF?

【ESP-IDF】如何安装ESP-IDF&#xff1f;Windows命令行安装ESP-IDFVs Code 图形IDE首先参考这篇视频&#xff1a;https://www.bilibili.com/blackboard/webplayer/embed-whitelist-other.html?aid520120377&bvidBV1hM411k7zz&cid888070526&page1本篇教程以Windows…

vue2路由守卫

全局前置_路由守卫 以前古代有一个职称叫御前侍卫&#xff1a;保护君王的安全&#xff0c;而路由守卫就是保护路由的安全&#xff08;权限&#xff09; 就是在Home组件中&#xff0c;我们需要先校验内容中的school是否满足要求&#xff0c;才能展示组件&#xff0c;否则不展示…

SpringBoot项目中遇到的订单支付超时未支付关闭订单的解决方案

1、扫表轮循 定时任务 > 获取数据 > 数据层 > 筛选出过期的数据 > 批量关闭超时订单 优点&#xff1a;实现简单、适用于小项目、数据量比较少 缺点&#xff1a;订单量过大的时候查询和修改数据库压力大、服务器内存消耗大、IO瓶颈 2、Redis懒删除 用户获取订单信…

java SSM选房管理系统idea开发mysql数据库java编程计算机网页源码maven项目

一、源码特点 SSM选房管理系统是一套完善的完整医院类型系统&#xff0c;结合SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了&#xff0c;Twitter的推荐系统是什么样的呢&#xff1f;Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的&#xff1f;02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

VR虚拟核电设备拆除模拟培训降低风险

核电站设备拆除是一项高危、复杂的任务&#xff0c;因此进行安全、有效的培训至关重要。为此&#xff0c;将VR虚拟现实技术应用于核电厂中&#xff0c;通过100%模拟还原真实的拆除操作场景&#xff0c;广泛应用到核电厂展示、巡检和拆除等环节中&#xff0c;极大提高了生产效率…

单片机学习之中断与定时/计数器

记录学习中断的使用。 1. 使用工具 使用开发板&#xff1a; 普中科技开发板 编译软件&#xff1a; keil 2. 复习中断及相关概念 CPU在处理 事件A 时&#xff0c;中断源 发出中断请求&#xff0c;请求cpu处理事件B &#xff0c;cpu 中断 当前工作&#xff0c;转去处理事件B&a…