026十三号星期五(枚举+打表)

题目描述:

十三号星期五真的很不常见吗? 每个月的十三号是星期五的频率是否比一周中的其他几天低? 请编写一个程序,计算 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] + " ");
		}
		
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值