(详细)《美国节日》:某月的第几个星期几
目录
一、题目描述:
二、思路:
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-252013-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();}}
}
相关文章:
(详细)《美国节日》:某月的第几个星期几
目录 一、题目描述: 二、思路: 1、给定 年月日,如何知道这天是星期几? 2、已知这个月的第一天是星期几,如何知道第三个星期一是几号? 3、最后一个星期一 三、思路总结 四、代码 一、题目描述…...
架构设计的历史背景
架构设计的历史背景 在探讨架构设计的历史背景时,了解软件开发进化的历史是一个重要的起点。了解软件开发的演变过程可以帮助我们更好地理解架构设计的起源和发展。现在,让我们来简要回顾一下软件开发的历史,并探索软件架构出现的背景。 首先…...
C#,初学琼林(06)——组合数的算法、数据溢出问题的解决方法及相关C#源代码
1 排列permutation 排列,一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。特别地,当mn时,这个排列被称作全…...
MySQL数据库——绘制E-R图:数据库概要设计阶段
在MySQL数据库的概要设计阶段,绘制E-R图是非常重要的一步。E-R图(实体关系图)是一种图形化的工具,用于描述数据库中实体之间的关系。 以下是在MySQL数据库概要设计阶段绘制E-R图的步骤: 确定实体:在MySQL数…...
对类和对象的理解
对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的…...
edge-tts微软文本转语音库,来听听这些语音是否很熟悉?
上期图文教程,我们分享了Azure机器学习的文本转语音的账号申请与API申请的详细步骤,也介绍了基于python3实现Azure机器学习文本转语音功能的代码实现过程,虽然我们可以使用Azure账号免费提供一年的试用期,但是毕竟是要付费的,我们的API也无法长期使用,好在微软发布了edge…...
MySQL更换存储引擎
要更换 MySQL 5.7 中某个表的存储引擎,可以使用以下的 SQL 命令: sql复制代码 ALTER TABLE table_name ENGINEengine_name; 其中,table_name 是需要更换存储引擎的数据表名称,engine_name 则是需要更换成的新存储引擎名称。 举…...
filebeat收集不规则多行日志
现环境有多行日志输出内容和格式不确定,合并后使用grok默认正则无法收集,需要自己编写正则 日志内容如下: ERROR|2023-04-06 14:27:52|helper|test|http|/api/ad/listBanner|1d60fff861bqwe4b0397be554141eb 127.0.0.1|1b4429-5adb-44d4-acf…...
Token Contrast for Weakly-Supervised Semantic Segmentation
文章来源:[CVPR2023] Keywords:Weakly-Supervised Semantic Segmentation(WSSS);over-smoothing; ViT 一、本文提出的问题以及解决方案: 本文解决了over-smoothing问题,该问题其实是在之前的GCN网络中提出…...
Jenkins运行在docker中使用Maven构建Java应用程序
这篇笔记是Jenkins入门教程使用Maven构建Java应用程序的一个补充说明,因为我照着文档操作的过程中遇到不少问题,遂一一做个笔记。 我的主机是Windows 11,安装的docker是Docker Desktop 4.18.0。 第一点,在Windows里执行docker命…...
将excel导入到sqlite的方法代码
Python实现excel转sqlite的方法,具体如下: Python环境的安装配置就不说了,个人喜欢pydev的开发环境。 python解析excel需要使用第三方的库,这里选择使用xlrd 下面是源代码: #!/usr/bin/python # encodingutf-8 Creat…...
Redis主从复制、哨兵和集群部署
文章目录一、主从复制1、主从复制-哨兵-集群2、主从复制的概念3、主从复制的作用4、主从复制流程5、部署Redis 主从复制步骤6、实例操作:部署Redis 主从复制二、哨兵模式1、哨兵模式的原理2、哨兵模式的作用3、哨兵结构由两部分组成,哨兵节点和数据节点4…...
protobuf序列化
文章目录protubufprotobuf序列化protobuf的原理定义message编译message文件应用protobufMessage 基本用法Message 嵌套使用protubuf protobuf序列化 protobuf是一种比json和xml等序列化工具更加轻量和高效的结构化数据存储格式,性能比json和xml真的强很多ÿ…...
更新时无冲突的情况(阁瑞钛伦特软件-九耶实训)
大多数使用“与资源库同步”菜单的目的是想查看本地和远程资源的差异,并不想将本地的内容进行更新。 而“更新”菜单则不然,它的主要作用是将远程仓库中的内容下载到本地,以使本地的版本内容和仓库中的内容一致。 Step01:复用前…...
3.4 函数的单调性和曲线的凹凸性
学习目标: 如果我要学习函数的单调性和曲线的凹凸性,我会采取以下几个步骤: 理解概念和定义:首先,我会学习单调性和凹凸性的定义和概念。单调性是指函数的增减性质,可以分为单调递增和单调递减;…...
LeetCode 404. 左叶子之和 | C++语言版
LeetCode 404. 左叶子之和 | C语言版LeetCode 404. 左叶子之和题目描述解题思路思路一:使用递归代码实现运行结果参考文章:思路二:减少遍历节点数代码实现运行结果参考文章:LeetCode 404. 左叶子之和 题目描述 题目地址…...
arm架构安装Rancher并导入k8s集群解决Error: no objects passed to apply
Rancher介绍 Rancher 2.0-2.4版本 是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。 Rancher 2.5版本 是为使用容…...
安装PaddleSpeech
github地址https://github.com/PaddlePaddle/PaddleSpeech 创建虚拟环境 conda create -p E:\Python\envs\nlppaddle python3.7 # conda create -p E:\Python\envs\speechstu python3.8激活虚拟环境 conda activate E:\Python\envs\nlppaddle # conda activate E:\Python\…...
UE “体积”的简单介绍
目录 一、阻挡体积 二、摄像机阻挡体积 三、销毁Z体积 四、后期处理体积 一、阻挡体积 你可以在静态网格体上使用阻挡体积替代碰撞表面,比如建筑物墙壁。这可以增强场景的可预测性,因为物理对象不会与地面和墙壁上的凸起细节相互作用。它还能降低物理模…...
微信 JAVA SDK 封装
weixin-popular 微信 JAVA SDK,是微信平台(公众平台、开放平台、商户平台、服务商平台)接口服务的JAVA 实现,开发 严格按照官方技术文档,合理划分包名、定义字段及方法,能胜任任何微信相关的业务。 使用建…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
