1341. 十三号星期五
十三号星期五真的很不常见吗?
每个月的十三号是星期五的频率是否比一周中的其他几天低?
请编写一个程序,计算 NNN 年内每个月的 131313 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。
测试的时间段将会开始于 190019001900年 111月 111 日,结束于 1900+N−11900+N−11900+N−1 年 121212 月 313131日。
一些有助于你解题的额外信息:
- 190019001900 年 111 月 111 日是星期一。
- 在一年中,444 月、666 月、999 月、111111 月每个月 303030 天,222 月平年 282828 天,闰年 292929 天,其他月份每个月313131天。
- 公历年份是444 的倍数且不是 100100100 的倍数的年份为闰年,例如 199219921992 年是闰年,199019901990 年不是闰年。
- 公历年份是整百数并且是 400400400 的倍数的也是闰年,例如170017001700年,180018001800年,190019001900年,210021002100年不是闰年,200020002000年是闰年。
输入格式
共一行,包含一个整数 NNN。
输出格式
共一行,包含七个整数,整数之间用一个空格隔开,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三号出现的次数。
数据范围
1≤N≤4001≤N≤4001≤N≤400
输入样例:
20
输出样例:
36 33 34 33 35 35 34
思路:
本题看着很难,要考虑的事情很多,其实想明白了的话,就是一个简单的打表模拟题。
打表是一种典型的用空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。
步骤:
- 先枚举年,在枚举月
- 看一年的
12个月中,13号落在周几 - 如果是闰年,
2月天数+ 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//打表列出每月的天数,为了让月份和数组的索引对应,这里让数组长度是13,第一个元素设为0
int[] months = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int[] weekdays = new int[7];//记录每月十三号是周几的数组
int days = 0;//记录当前离1990年1月1号已经过了多少天
for(int year = 1900;year < 1900 + n;year++){
for(int j = 1; j <= 12;j++){
//开始就是1号,所以加12就是13号,然后模7便是当前13号是星期几
weekdays[(days + 12) % 7]++;
days += months[j];
if(j == 2){//如果是闰年,则二月要多加上一天
if((year % 4 == 0 && year % 100 != 0) || (year % 400 ==0)){
days++;
}
}
}
}
//输出周六至周五的数量
for(int i = 5,j = 0; j < 7;i = (i + 1) % 7,j++){
System.out.print(weekdays[i] + " ");
}
}
}

该博客探讨了在给定年份范围内每个月13号是星期五的频率,并提供了一个程序来模拟并计算这一概率。通过遍历年份、月份,考虑闰年的条件,博主展示了如何使用编程解决日期和星期之间的关系问题。输出结果展示了一年内每个月13号出现各天数的统计情况。
108

被折叠的 条评论
为什么被折叠?



