day12 1341十三号星期五(打表、模拟)

1341. 十三号星期五

十三号星期五真的很不常见吗?

每个月的十三号是星期五的频率是否比一周中的其他几天低?

请编写一个程序,计算 N N N 年内每个月的 13 13 13 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。

测试的时间段将会开始于 1900 1900 1900 1 1 1 1 1 1 日,结束于 1900 + N − 1 1900+N−1 1900+N1 12 12 12 31 31 31日。

一些有助于你解题的额外信息:

  1. 1900 1900 1900 1 1 1 1 1 1 日是星期一。
  2. 在一年中, 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天。
  3. 公历年份是 4 4 4 的倍数且不是 100 100 100 的倍数的年份为闰年,例如 1992 1992 1992 年是闰年, 1990 1990 1990 年不是闰年。
  4. 公历年份是整百数并且是 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 1N400
输入样例:

20

输出样例:

36 33 34 33 35 35 34

思路:

本题看着很难,要考虑的事情很多,其实想明白了的话,就是一个简单的打表模拟题。

打表是一种典型的用空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。

步骤:

  1. 先枚举年,在枚举月
  2. 看一年的12个月中,13号落在周几
  3. 如果是闰年,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] + " ");
        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值