江苏省住房城乡建设厅官方网站,做网站练手项目,百度云网盘资源搜索引擎,建网站一年要多少钱目录
一、题目描述#xff1a; 二、思路#xff1a;
1、给定 年月日#xff0c;如何知道这天是星期几#xff1f;
2、已知这个月的第一天是星期几#xff0c;如何知道第三个星期一是几号#xff1f;
3、最后一个星期一 三、思路总结
四、代码 一、题目描述#xf…目录
一、题目描述 二、思路
1、给定 年月日如何知道这天是星期几
2、已知这个月的第一天是星期几如何知道第三个星期一是几号
3、最后一个星期一 三、思路总结
四、代码 一、题目描述
美国节日 美国节日
和中国的节日不同美国的节假日通常是选择某个月的第几个星期几这种形式因此每一年的放假日期都不相同。具体规则如下 * 1月1日元旦 * 1月的第三个星期一马丁·路德·金纪念日 * 2月的第三个星期一总统节 * 5月的最后一个星期一阵亡将士纪念日 * 7月4日美国国庆 * 9月的第一个星期一劳动节 * 11月的第四个星期四感恩节 * 12月25日圣诞节 现在给出一个年份请你帮忙生成当年节日的日期。 输入描述: 输入包含多组数据每组数据包含一个正整数year2000≤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 1364为 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();}}
}