1341. 十三号星期五
十三号星期五真的很不常见吗?
每个月的十三号是星期五的频率是否比一周中的其他几天低?
请编写一个程序,计算 N N N 年内每个月的 13 13 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。
测试的时间段将会开始于 1900 1900 1900年 1 1 1月 1 1 1 日,结束于 1900 + N − 1 1900+N−1 1900+N−1 年 12 12 12 月 31 31 31日。
一些有助于你解题的额外信息:
- 1900 1900 1900 年 1 1 1 月 1 1 1 日是星期一。
- 在一年中, 4 4 4 月、 6 6 6 月、 9 9 9 月、 11 11 11 月每个月 30 30 30 天, 2 2 2 月平年 28 28 28 天,闰年 29 29 29 天,其他月份每个月 31 31 31天。
- 公历年份是 4 4 4 的倍数且不是 100 100 100 的倍数的年份为闰年,例如 1992 1992 1992 年是闰年, 1990 1990 1990 年不是闰年。
- 公历年份是整百数并且是 400 400 400 的倍数的也是闰年,例如 1700 1700 1700年, 1800 1800 1800年, 1900 1900 1900年, 2100 2100 2100年不是闰年, 2000 2000 2000年是闰年。
输入格式
共一行,包含一个整数
N
N
N。
输出格式
共一行,包含七个整数,整数之间用一个空格隔开,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三号出现的次数。
数据范围
1
≤
N
≤
400
1≤N≤400
1≤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] + " ");
}
}
}