题目描述:
十三号星期五真的很不常见吗? 每个月的十三号是星期五的频率是否比一周中的其他几天低? 请编写一个程序,计算 N年内每个月的 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。 测试的时间段将会开始于 1900年 1月 1日,结束于
1900+N−1年12 月 31日。
一些有助于你解题的额外信息:
1.19001900 年 11 月 11 日是星期一。
2.在一年中,44 月、66 月、99 月、1111 月每个月 3030 天,22 月平年 2828 天,闰年 2929 天,其他月份每个月31天。
3、公历年份是 44 的倍数且不是 100100 的倍数的年份为闰年,例如 19921992 年是闰年,19901990 年不是闰年。
4.公历年份是整百数并且是 400400 的倍数的也是闰年,例如1700年,1800年,1900年,2100年不是闰年,2000年是闰年。
输入格式:
共一行,包含一个整数 N。
输出格式:
共一行,包含七个整数,整数之间用一个空格隔开,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三号出现的次数。
数据范围:
1≤N≤400
输入样例:
20
输出样例:
36 33 34 33 35 35 34
思路:枚举月,用days来记录每月1号距离起点(1900年1月1号)过了多少天,那么每月13号距离起点就是(days + 12)天。 (days + 12)%7余0为周一,余1为周周二,以此类推。
技巧:开个数组记录每月的天数。
import java.util.Scanner;
public class Main{
static int[] month = {0,31,28,31,30,31,30,31,31,30,31,30,31};
static int[] weekday = new int[7];
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
int n = read.nextInt();
int days = 0;//每月1号距离起点的天数
for(int year = 1900;year < 1900 + n;year++) {
for(int i = 1;i <= 12;i++) {
weekday[(days + 12)%7]++;
days += month[i];
if(i == 2) {//若为闰年,则天数加1
if(year % 100 !=0 && year % 4 == 0 || year%100 == 0 && year % 400 ==0) {
days++;
}
}
}
}
for(int i = 5,j = 0;j < 7; i = (i+1)%7,j++) {//i从5开始,因为是从星期六开始输出的
System.out.print(weekday[i] + " ");
}
}
}